| Удаление указателей | 
|  | 
| 
| Necrolich | Дата: Четверг, 21 Апреля 2016, 18:28 | Сообщение # 1 |  | почетный гость Сейчас нет на сайте | Если я так делаю, то удаляется только указатель, а занятая память остается?
 |  |  |  |  | 
| 
| falcoware | Дата: Четверг, 21 Апреля 2016, 18:43 | Сообщение # 2 |  |   старожил Сейчас нет на сайте | Necrolich, удаляется память, выделенная под этот указатель. 
 Например:
 
 void *pPointer = new char[100];
 
 delete pPointer;
 |  |  |  |  | 
| 
| Gudleifr | Дата: Четверг, 21 Апреля 2016, 19:27 | Сообщение # 3 |  |   почти ветеран Сейчас нет на сайте | Это неправда. Удаляется то, что было выделено соответствующим new.Цитата falcoware (  ) удаляется память, выделенная под этот указатель.
 
 Цитата falcoware (  ) void *pPointer = new char[100];delete pPointer;
Еще одна ошибка. Тут надо delete[], т.к. был new[]. Более того, delete для void* это не кошерно.
 
 Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
 
 
 Сообщение отредактировал Gudleifr - Четверг, 21 Апреля 2016, 19:30 |  |  |  |  | 
| 
| Akyltist | Дата: Четверг, 21 Апреля 2016, 20:21 | Сообщение # 4 |  |   заслуженный участник Сейчас нет на сайте | Цитата Если я так делаю, то удаляется только указатель, а занятая память остается?смотря что удаляешь))
 
 
 Код int *var = new int;delete var;
а может объявлено было как то так?
 
 
 В любом случае Gudleifr - дал доходчивые пояснения.
 
 PS: еще желательно указывайте язык конкретнее, а то если говорить про С, то можно сказать что malloc и free предпочтительнее. Но я таки понимаю, что речь о Срр.
 
 
 Сообщение отредактировал Akyltist - Четверг, 21 Апреля 2016, 20:26 |  |  |  |  | 
| 
| Tymonr | Дата: Пятница, 22 Апреля 2016, 04:51 | Сообщение # 5 |  |   With OpenSource forever♥ Сейчас нет на сайте | Не грузите человеку мозги, он не дорос еще. Delete var чистит память, указатель остается
 
 Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
 Как правильно задавать вопросы в технических форумах
 |  |  |  |  | 
| 
| Snake174 | Дата: Пятница, 22 Апреля 2016, 09:22 | Сообщение # 6 |  |   участник Сейчас нет на сайте | Цитата Delete var чистит память, указатель остаетсяОбычно ещё так делают:
 
 
 Не следует обманывать инспектора
 Pipmak Assistant
 Love2D Exporter
 Love2D-Helpers
 
  Old Consoles Games |  |  |  |  | 
| 
| mozomig | Дата: Суббота, 23 Апреля 2016, 22:53 | Сообщение # 7 |  |   почетный гость Сейчас нет на сайте | Хоть уже все выше и сказали но все-таки внесу свой ляп ^_^ 
 Код int *pointer = new int; // динамический выделяем память под переменную типа integer (теперь указатель ссылается на участок памяти адресом например: 0x2443123)
 delete pointer;  //освобождаем память( удаляем то что хранилось в ячейке(пр. 0x2443123), данные мы удалили но указатель до сих пор указывает на ячейку 0x2443123
 pointer = 0; //присваиваем указателю 0(обнуляем) теперь указатель не ссылается на 0x2443123, связь потеряна.
 
 Я в телеграмме @mozomig
 
 
 Сообщение отредактировал freeman211 - Суббота, 23 Апреля 2016, 22:56 |  |  |  |  | 
| 
| Gudleifr | Дата: Суббота, 23 Апреля 2016, 23:50 | Сообщение # 8 |  |   почти ветеран Сейчас нет на сайте | Раз уж вы все так настаиваете, то, видимо, придется на этом остановиться: 
 pointer = 0,
 
 это, скорее всего, ошибка. Никогда так не делайте, разве что, если к этому есть какие-либо веские основания.
 
 Допустим, есть некий период жизни указателя, и обращение к нему за пределами этого периода - ошибочно. А вы, как умная Маша, поставили там "обнуления" и, соответственно, проверки "на 0". К чему это приведет? Скорее всего, к тому, что серьезнейшая ошибка "обращения" окажется замаскированной и вы будете, верить, что все хорошо.
 Это общий принцип - никогда не ставьте в функциях проверки на допустимость (assert) - они не защищают от ошибок, а лишь маскируют их. Чем раньше программа рухнет, тем скорее вы увидите ошибку и тем легче будет ее найти.
 
 Вообще же, следить за парностью new-delete (если вы не лепите что-то сильно оверлейное) совершенно не обязательно. Завершая программу, операционная система сама освободит всю выделенную память (и закроет все открытые файлы).
 
 Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
 
 
 Сообщение отредактировал Gudleifr - Суббота, 23 Апреля 2016, 23:52 |  |  |  |  |