Удаление указателей
|
|
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 |
почти ветеран
Сейчас нет на сайте
| Цитата falcoware ( ) удаляется память, выделенная под этот указатель. Это неправда. Удаляется то, что было выделено соответствующим new.
Цитата 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 |
|
| |