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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2018, 22:53   #1
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию Проверить существование объекта [продолжение]

Поскольку, предыдущая моя тема http://www.programmersforum.ru/showthread.php?t=317885 была закрыта по непонятныи причинам, а в причине была рекомендация создать новую, я решил создать продолжение и продолжит разговор о том, как же всё таки проверить существование объекта после удаления.

Сделал пример для наглядности в виде консоли

Код:
program obj_check;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function ObjectCheck(obj: TObject): Boolean;
begin
  Result := False;
  if obj = nil then
    Exit;
  try
    obj.ClassType();
  except
    on EAccessViolation do // Специально оставил эту проверку, для min@y™ ;)
      Exit;
    // Хотя, можно и без нее, не суть. try .. except всё стерпит :)
  end;
  Result := True;
end;

var
  obj: TObject;

begin
  Writeln('Ptess Enter to start!');
  ReadLn;
  Writeln('obj := TObject.Create();');
  obj := TObject.Create();
  Writeln('obj exists: ', ObjectCheck(obj));
  Writeln('Ptess Enter to continue!');
  ReadLn;
  Writeln('obj.Free();');
  obj.Free();
  Writeln('obj exists: ', ObjectCheck(obj));
  Writeln('Ptess Enter to exit!');
  ReadLn;
end.
В общем, чтобы try улавливало AV, оно должно возникать. Но как показала практика любое обращение к методам удаленного obj не вызывает никаких AV. Но почему так происходит, объект же был удален?!
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 06.03.2018, 23:39   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Закрыта была по причине начавшегося выяснения отношений. А исключение если и не возникает, то по другой причине - память выделенная под объект не очищается и мгновенно не выделяется под другие цели
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.03.2018, 00:19   #3
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Закрыта была по причине начавшегося выяснения отношений
Просто, некоторые пользователи воспринимают примеры кода, как личное оскорбление. Последствия: оскорбления и переход на личности. Еще, обозвали меня "говнокодером" :-) Возможно, кто-то на моем месте обиделся бы. Но я не смог удержаться, чтобы не заржать, простите Выяснять с кем-то отношения на техническом форуме у меня и в мыслях не было. Но за то, что кто-то здесь обижается на код О_о я ответственность не могу нести :-)


Цитата:
Сообщение от Аватар Посмотреть сообщение
память выделенная под объект не очищается и мгновенно не выделяется под другие цели
То есть, объект работает после удаления и все его поля, свойства и методы остаются по прежнему доступными или я чего-то не понял?
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 07.03.2018, 00:28   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
Просто, некоторые пользователи воспринимают примеры кода, как личное оскорбление. Последствия: оскорбления и переход на личности.
Вообще-то там скорее наоборот было.
"за ХХХ надо отрубать руки" не обязательно воспринимать буквально или как оскорбление ) Это скорее просто замечание о том, что не надо так делать.
Цитата:
Сообщение от cyberdev Посмотреть сообщение
То есть, объект работает после удаления и все его поля, свойства и методы остаются по прежнему доступными или я чего-то не понял?
поведение при доступе к удаленному объекту вряд ли гарантировано. Может быть так сложились звезды, что тот кусок памяти еще не перезаписан ничем.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.03.2018, 00:48   #5
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вообще-то там скорее наоборот было.
"за ХХХ надо отрубать руки" не обязательно воспринимать буквально или как оскорбление ) Это скорее просто замечание о том, что не надо так делать.
Там было вот так:
Цитата:
А вообще - за затыкание EAccessViolation между except и end надо отрубать руки и бить ими говнокодера прямо в нос.
Автор данного "художества" даже не удосужился посмотреть в код, чтобы понять, с какой целью я это сделал. Или мог бы хотя бы спросить. Да и я потом написал, что можно и без этой проверки. Просто так, будет проверять только AV, а без, всё подряд. Но после "говнокодера", "отрубить руки и бить ими в нос", у меня пропало всякое желание обсуждать что-либо с этим "кодером". Нецензурными словами его не называю...

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
поведение при доступе к удаленному объекту вряд ли гарантировано. Может быть так сложились звезды, что тот кусок памяти еще не перезаписан ничем.
М-да, странное поведение, при всём уважении к языку программирования Делфи.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net

Последний раз редактировалось cyberdev; 07.03.2018 в 00:51.
cyberdev вне форума Ответить с цитированием
Старый 07.03.2018, 01:23   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
Автор данного "художества" даже не удосужился посмотреть в код, чтобы понять, с какой целью я это сделал.
Так он говорил "вообще", про говнокодеров )
Вы ж не говнокодер?
Цитата:
Сообщение от cyberdev Посмотреть сообщение
М-да, странное поведение, при всём уважении к языку программирования Делфи.
Это скорее ОС, а не Дельфи. Зачем ей просто так перезаписывать память?
Продвинутые не говнокодеры обычно присваивают null указателю после удаления )
В Дельфи есть FreeAndNil.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.03.2018, 01:46   #7
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Это скорее ОС, а не Дельфи. Зачем ей просто так перезаписывать память?
Но, всё рано, признак удаления объекта должен же где-то быть?

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Продвинутые не говнокодеры обычно присваивают null указателю после удаления )
В Дельфи есть FreeAndNil.
Не хочу никого оскорблять, но бывают всякие кодеры! :-)

Да и хватит об этих нехороших кодерах, а то сюда уже чувствую запах
Сайт о программировании и трехмерной графике - cybersite.ucoz.net

Последний раз редактировалось cyberdev; 07.03.2018 в 01:55.
cyberdev вне форума Ответить с цитированием
Старый 07.03.2018, 02:06   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Но, всё рано, признак удаления объекта должен же где-то быть?
нет.
все любые проверки будут надеятся на то что все указатели ведут куда либо.
память может быть все еще валидна, но вот данные по ней нет.

потому вы сами себя должны обезопасить, иначе ССЗБ.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.03.2018, 02:12   #9
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
нет.
все любые проверки будут надеятся на то что все указатели ведут куда либо.
память может быть все еще валидна, но вот данные по ней нет.

потому вы сами себя должны обезопасить, иначе ССЗБ.
А вот этот код может решить проблему?

Код:
function ValidateObj(Obj: TObject): Pointer;
// see { Virtual method table entries } in System.pas
begin
  Result := Obj;
  if Assigned(Result) then
    try
      if Pointer(PPointer(Obj)^) <> Pointer(Pointer(Cardinal(PPointer(Obj)^) + Cardinal(vmtSelfPtr))^) then
        // object not valid anymore
        Result := nil;
    except
      Result := nil;
    end;
end;
Или этот?

Код:
function ValidateObj(Obj: TObject): Pointer;
type
  PPVmt = ^PVmt;
  PVmt = ^TVmt;
  TVmt = record
    SelfPtr : TClass;
    Other   : array[0..17] of pointer;
  end;
var
  Vmt: PVmt;
begin
  Result := Obj;
  if Assigned(Result) then
    try
      Vmt := PVmt(Obj.ClassType);
      Dec(Vmt);
      if Obj.ClassType <> Vmt.SelfPtr then
        Result := nil;
    except
      Result := nil;
    end;
end;
Я просто имею очень посредственное представление о структуре объекта с точки зрения низкоуровневого программирования.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 07.03.2018, 03:11   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

2 cyberdev.
Вы затронули весьма и очень сложный вопрос.
И не надо пенять на Дельфи. То же самое у вас возникло бы при использовании любого другого языка программирования.
Вам бы не помешало понять саму суть AV.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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