Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > Происхождение действия: занулление указателя после delete.


Автор: Сергей85 29.11.21, 14:17
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int *ttt = new int[10000000000000000000000];
     
    delete[] ttt;
     
    ttt = NULL.

Обязательно ли занулять указатель? Если да - в какой литературе об этом прочитать? В учебниках ни об этом, ни о сборщике мусора вообще ничего нет.

Автор: Славян 29.11.21, 16:22
Необязательно. Просто, если вы далее будете вручную следить за указателями и очищать память при ненулевых, то будет изъян. А если такого нет, то можно и забить.

Автор: scrambrella 30.11.21, 22:58
Обычная говнокодерская практика, передаваемая из уст в уста. Паттерн проектирования так сказать. Для себя пишем можно чистить или нет.

Автор: Qraizer 01.12.21, 03:07
scrambrella, не знаешь, откуда звон, попридержи язык.

Автор: scrambrella 01.12.21, 19:56
Цитата Qraizer @
scrambrella, не знаешь, откуда звон, попридержи язык.

Что я не знаю? Невыделенная память помечается нулевым указателем. Если он ненулевой значит память выделена и может быть очищена.
Я неправильно понимаю?

Автор: Сергей85 03.12.21, 14:05
Цитата Qraizer @

Qraizer. Он правильно понимает? )))

5272190.jpg (, : 219)

Добавлено
Нашел такое мнение.

"arr[i] = NULL; //освобождаем указатель, если его копия хранится еще где-либо в другом месте
//объект не будет уничтожен"

https://www.cyberforum.ru/post1005751.html

Добавлено
Есть еще такое мнение.

"Обычно советуют обнулять указатель после освобождения указываемой им памяти, чтобы при повторной попытке удаления памяти не возникла ошибка выполнения программы. Например, данный код корректен"

https://ru.stackoverflow.com/questions/5964...80%d0%b0-delete

Вопрос еще и в том, что даже если 10 из 10 скажут "удалять надо" - указано будет 10 разных причин. Как выявить правильные? В какой литературе об этом написано и на каких страницах?

Автор: Qraizer 03.12.21, 15:11
Цитата Сергей85 @
Qraizer. Он правильно понимает? )))
Беспонятия. Я не знаю языка, на котором он выражает свои... мысли.
Цитата Сергей85 @
Нашел такое мнение.
Там не указатель, там boost::shared_ptr<>. Это объект со своим поведением, притворяющийся указателем. Главным его отличием от указателя является то, что он владеет объектом, на который указывает, и умеет подсчитывать количество его пользователей. Присваивание себе нуля он рассматривает как уменьшение количества пользователей. Это всё не имеет никакого отношения к обычным указателям, о которых ты спрашивал.
По второй ссылке более дельные мысли. Но то же сказал и Славян. Его хотя бы понять возможно, хоть и не без труда.
Цитата Сергей85 @
...даже если 10 из 10 скажут "удалять надо" - указано будет 10 разных причин. Как выявить правильные? В какой литературе об этом написано и на каких страницах?
Просто нужно прочитать все эти 10 причин и сделать свои выводы. Обычно зануление в таких случаях это паранойя на действия самого себя. Но не всегда, смотря как пишешь и какие идеи реализуешь, а также это может быть частью используемого тобой API. Например в VCL принято не просто delete-ить TObject, но и занулять поинтер на него, в Дельфях даже спецом процедуру для этого придумали, FreeAndNil. А всё потому, что там тоже есть понятие владельца объекта, но увы, нет shared_ptr, так что пришлось выдумать такой вот костыль.
В общем, пользовать чи не, абсолютно твоё решение. Ничего конкретного советовать не буду.

Автор: scrambrella 04.12.21, 11:57
В качественном промышленном коде указателей не должно быть в принципе. Для хранения массивов данных необходимо использовать контейнеры.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)