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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2018, 14:26   #11
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
2 cyberdev.
Вы затронули весьма и очень сложный вопрос.
И не надо пенять на Дельфи. То же самое у вас возникло бы при использовании любого другого языка программирования.
Вам бы не помешало понять саму суть AV.
Почему же в любом языке? Например, в C++ такой проблемы не возникает, так как специальное ключевое слово delete сначала вызывает деструктор, а потом устанавливает ссылку на объект в NULL. Жаль, что в Делфи нет такого.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 07.03.2018, 14:28   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не устанавливает.
Но там зато есть куча других вещей для управления памятью типа RAII, smart указателей.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.03.2018, 15:02   #13
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Не устанавливает.
Да я писал ему уже об этом. Видимо, человек не читает то, что ему пишут
Black Fregat вне форума Ответить с цитированием
Старый 07.03.2018, 17:59   #14
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
так как специальное ключевое слово delete сначала вызывает деструктор, а потом устанавливает ссылку на объект в NULL.
Нет не устанавливает, а вот в Delphi есть для этого FreeAndNil()
Avazart вне форума Ответить с цитированием
Старый 07.03.2018, 18:01   #15
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
В общем, чтобы try улавливало AV, оно должно возникать. Но как показала практика любое обращение к методам удаленного obj не вызывает никаких AV. Но почему так происходит, объект же был удален?!
Ответ: не должно, а - может возникать AV, а может и не возникать, это на волю случая.
Avazart вне форума Ответить с цитированием
Старый 07.03.2018, 19:51   #16
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Да я писал ему уже об этом. Видимо, человек не читает то, что ему пишут
В учебниках по C++ вроде написано другое. Сейчас некогда разбираться, потом проверю.

Цитата:
Сообщение от Avazart Посмотреть сообщение
Нет не устанавливает, а вот в Delphi есть для этого FreeAndNil()
Кучу раз уже это обсуждалось. Проблема в том, что можно, как FreeAndNil, так и Free. Результат с Free получается не очень. Плюс, в следствии этого, невозможно контролировать, кто и как удаляет. Вопрос заключается в том, как сделать надежную защиту, об этом я также говорил.


Цитата:
Сообщение от Avazart Посмотреть сообщение
Ответ: не должно, а - может возникать AV, а может и не возникать, это на волю случая.
Это понятно.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net

Последний раз редактировалось cyberdev; 07.03.2018 в 19:56.
cyberdev вне форума Ответить с цитированием
Старый 08.03.2018, 02:01   #17
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
Кучу раз уже это обсуждалось. Проблема в том, что можно, как FreeAndNil, так и Free. Результат с Free получается не очень. Плюс, в следствии этого, невозможно контролировать, кто и как удаляет. Вопрос заключается в том, как сделать надежную защиту, об этом я также говорил.
Результаты с Free абсолютно надёжны. Надо только грамотно писать код.
Метод Free единственно что делает, так это возвращает запрошенную ранее память у ОС (точнее у менеджера памяти, который является посредником в данной операции).
FreeAndNil (имхо) придуман троешниками для троешников. Помимо всего того что делает метод Free он ещё зачем-то обнуляет конкретную ссылку на уничтожаемый объект. А нафига!?
Ведь ссылок на объект может быть гораздо более одной. А обнулится только одна.
А если ссылка только одна, то зачем её проверять?

Последний раз редактировалось northener; 08.03.2018 в 02:14.
northener вне форума Ответить с цитированием
Старый 08.03.2018, 02:16   #18
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
Вопрос заключается в том, как сделать надежную защиту
Защиту чего и от чего?
northener вне форума Ответить с цитированием
Старый 08.03.2018, 12:08   #19
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ведь ссылок на объект может быть гораздо более одной. А обнулится только одна.
А если ссылка только одна, то зачем её проверять?
Да забейте вы все на это. Я этому организму ещё в закрытой предыдущей теме объяснил, что писать прогу, где понадобятся такие проверки - это говнокод.

Ну не хочет чувак в это верить. Остаётся только процитировать классика и успокоиться.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 08.03.2018 в 21:34.
min@y™ вне форума Ответить с цитированием
Старый 08.03.2018, 19:00   #20
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
В учебниках по C++ вроде написано другое. Сейчас некогда разбираться, потом проверю.
Конкретно в каком учебнике?
Любой программист С++ Вам скажет что это не так.

Цитата:
Сообщение от northener Посмотреть сообщение
Результаты с Free абсолютно надёжны. Надо только грамотно писать код.
Метод Free единственно что делает, так это возвращает запрошенную ранее память у ОС (точнее у менеджера памяти, который является посредником в данной операции).
FreeAndNil (имхо) придуман троешниками для троешников. Помимо всего того что делает метод Free он ещё зачем-то обнуляет конкретную ссылку на уничтожаемый объект. А нафига!?
И то и другое работает очевидным образом.

Зачем обнулять ссылку?
Ну это то же банально:
1. Что бы можно было проверить существование объекта.
2. Что бы получить исключение при ошибочном обращении.
Код:
FreeAndNill(FMyObject);
// ...
if not Assigned(FMyObject) then
    FMyObject := TMyClass.Create()
else
    ShowMessage('Already created!')
Это не более чем сахар.
В С++ тоже используют delete p; p = 0; когда указатель используется многократно для проверки существования объекта.

Последний раз редактировалось Alex11223; 08.03.2018 в 20:06.
Avazart вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить существование объекта cyberdev Общие вопросы Delphi 23 06.03.2018 19:56
JSON проверить существование значения Dozent Общие вопросы Delphi 2 07.04.2015 18:16
Проверить существование значения в TStringList Shouldercannon Общие вопросы Delphi 4 20.01.2013 15:03
Проверить существование папки Stepan575 Visual C++ 4 17.12.2010 19:02