Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.03.2018, 01:16   #1
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию Проверить существование объекта

Известно, что в Делфи все объекты представлены как указатели. Поэтому, если объявить объект и создать его с помощью конструктора, а затем выгрузить с помощью метода Free, то оставшийся указатель будет указывать на адрес несуществующего объекта (конечно, если дополнительно не поставить его в nil, после удаления). Последующее обращение к объекту вызовет AV и программа не сможет продолжить работу. Как проверить, действительно ли удален объект, после вызова метода Free?
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума
Старый 06.03.2018, 07:20   #2
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

После Free или FreeAndNil объект будет действительно удален.
Код:
MyObject := TObject.create;
if MyObject <> nil then 
Showmessage('Я тут!');
FreeAndNil(MyObject );
if MyObject =nil then 
Showmessage('Меня уже нет =(')
Проверить действительно ли удален объект можно включив
ReportMemoryLeaksOnShutdown := True;
Пишу много и развернуто
Heneken87 вне форума
Старый 06.03.2018, 08:24   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Писать код, внутри которого понадобится такая проверка - это, имхо, говнокодинг.
Но формально, для локальных объектов, в FreeAndNil() нет смысла.
Код:
x:= TMyClass.Create();
try
  // блаблабла
finally
  x.Free();
end;
FreeAndNil() нужен только для глобальных переменных и/или полей других объектов, т.е. тех ячеек памяти, которые неоднократно будут использоваться и после деструкторов объектов, на которые они указывают.

Доклад окончил.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 06.03.2018, 14:03   #4
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
После Free или FreeAndNil объект будет действительно удален.
Код:
MyObject := TObject.create;
if MyObject <> nil then 
Showmessage('Я тут!');
FreeAndNil(MyObject );
if MyObject =nil then 
Showmessage('Меня уже нет =(')
Проверить действительно ли удален объект можно включив
ReportMemoryLeaksOnShutdown := True;
Ну, на счет FreeAndNil, это всем известно. Можно еще поставить объект в nil и прядок. Но, к сожалению, не все так делают, потому, как в Делфи объект сам удаляет себя. Но поставить самого себя в nil он не может. Вот что я, собственно и хотел подчеркнуть в данной теме. К примеру, в C++ есть ключевое слово delete. Объект удаляется, а указатель устанавливается в NULL. В Делфи такого нет, поэтому нужна функция, которая компенсировала бы данный недостаток. Подумал, что для проверки подойдет функция Assigned, но оказалось, это обычная проверка указателя на nil.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума
Старый 06.03.2018, 14:08   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
К примеру, в C++ есть ключевое слово delete. Объект удаляется, а указатель устанавливается в NULL. В Делфи такого нет,
есть. используйте FreeAndNil() и будет Вам:
Код:
Объект удаляется, а указатель устанавливается в nil
Serge_Bliznykov вне форума
Старый 06.03.2018, 14:14   #6
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
ReportMemoryLeaksOnShutdown := True;
Это включает отображение отчета об утечках памяти. То есть, наоборот, когда указателей нет, а сами объекты остались. Либо и то и другое.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума
Старый 06.03.2018, 14:29   #7
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
есть. используйте FreeAndNil() и будет Вам:
Код:
Объект удаляется, а указатель устанавливается в nil
Проблема не в том, как я удаляю объекты, а в том, что удаление объектов их методами разрешили. Следовательно, неправильное удаление в принципе возможно! Поэтому, любая программа, написанная на Делфи может наступить на эти грабли, особенно если исходника на сторонний код нет, а есть только файл *.dcu!

P.S.: Тем, кто не понял вопрос: не пишите о FreeAndNil, Free и об установке объекта в nil. Вопрос заключается не в этом!
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума
Старый 06.03.2018, 15:03   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
Поэтому, любая программа, написанная на Делфи может
Любая программа криво написанная на любом языке может.

пишите правильно и всё будет хорошо.
Serge_Bliznykov вне форума
Старый 06.03.2018, 15:06   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Любая программа криво написанная на любом языке может.

пишите правильно и всё будет хорошо.
Категорически согласен.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 06.03.2018, 15:34   #10
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
пишите правильно и всё будет хорошо
Вот я и хочу понять как правильно писать программы на Делфи, при том, что за сторонних разработчиков я ответственности не несу :-)
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JSON проверить существование значения Dozent Общие вопросы Delphi 2 07.04.2015 18:16
Проверить существование файла на сервере Wicort JavaScript, Ajax 8 04.05.2012 23:16
Проверить существование папки Stepan575 Visual C++ 4 17.12.2010 19:02
Проверить существование поля в JavaScript Wicort JavaScript, Ajax 2 06.10.2009 18:13