Воскресенье, 17 Ноября 2024, 16:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Удаление указателей
NecrolichДата: Четверг, 21 Апреля 2016, 18:28 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Код
delete var

Если я так делаю, то удаляется только указатель, а занятая память остается?
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;

а может объявлено было как то так?
Код
int *prt = &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 чистит память, указатель остается

Обычно ещё так делают:
Код

delete var;
var = 0;


Не следует обманывать инспектора
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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг