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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.03.2018, 15:35   #11
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Вы хоть читали что ТС спрашивал? Или вы тут пример комментируете?
Пишу много и развернуто
Heneken87 вне форума
Старый 06.03.2018, 15:37   #12
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
Это включает отображение отчета об утечках памяти. То есть, наоборот, когда указателей нет, а сами объекты остались. Либо и то и другое.
Я вкурсе зачем это. Читайте что хотел ТС, он хотел убедится что объект удален. С помощью этого вы убедитесь что объект удален???? Имхо если он не удален, то это утечка.... Хотя ты и есть ТС
Пишу много и развернуто

Последний раз редактировалось Heneken87; 06.03.2018 в 15:41.
Heneken87 вне форума
Старый 06.03.2018, 15:38   #13
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
Вот я и хочу понять как правильно писать программы на Делфи, при том, что за сторонних разработчиков я ответственности не несу :-)
Никогда не юзай чужие DCU. У меня за всю карьеру не была ни единого случая, когда невозможно было без них обойтись.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 06.03.2018, 15:39   #14
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

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

Доклад окончил.
Никто и не спрашивал о формальностях, а также никто не скажет о говнокоде, без самого кода..зачем это нужно автору непонятно. В теме не было вопроса о том, как удалять объект... Был вопрос как проверить.
Пишу много и развернуто
Heneken87 вне форума
Старый 06.03.2018, 15:43   #15
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
Никто и не спрашивал о формальностях, а также никто не скажет о говнокоде, без самого кода..зачем это нужно автору непонятно. В теме не было вопроса о том, как удалять объект... Был вопрос как проверить.
А я и не спорю.

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

Написал следующую функцию для проверки:

Код:
function ObjectCheck(obj: TObject): Boolean;
begin
  Result := False;
  if obj = nil then
    Exit;
  try
    obj.ClassName();
  except
    on EAccessViolation do
      Exit;
  end;
  Result := True;
end;
Пробую вызвать любой метод объекта между try и except. Если память очищена, а указатель не nil, то произойдет AV. Как это работает не проверял. Но, в любом случае, AV будет вылетать после запуска программы из среды разработки, а так же во время отладки. Таким образом, осталось отключить вылетание мессагов на время, когда будет возникать AV. Как это сделать в Делфи?
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума
Старый 06.03.2018, 16:48   #17
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

https://stackoverflow.com/questions/...-already-freed
Filka на форуме
Старый 06.03.2018, 17:04   #18
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
Если память очищена, а указатель не nil, то произойдет AV.
А вот тут ты можешь обломаться, чувак.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 06.03.2018, 17:05   #19
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
К примеру, в C++ есть ключевое слово delete. Объект удаляется, а указатель устанавливается в NULL.
Мне кажется, Вы что-то путаете. Ни один указатель в С++ принудительно в нуль не устанавливается. Не говоря уже о том, что их может быть несколько..
Black Fregat вне форума
Старый 06.03.2018, 17:08   #20
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
Функции из https://stackoverflow.com/questions/...-already-freed

Код:
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;
и http://hallvards.blogspot.com/2004/0...id-object.html

Код:
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 вне форума
Закрытая тема


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