Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка переменной-инстанса объекта, проверка актуальности объекта (Assigned) 
:(
    Опции темы
MetalFan
Дата 9.10.2007, 18:43 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Как известно, простое освобождение памяти объекта посредством TObject.Free
делает невозможным дальнейшее получение статуса(Создан/Освобожден) переменной-объекта стандартными способами.
т.е.
Код

var
  lObject: TSomeObject;
begin
  lObject := TSomeObject.Create;
...
  lObject.Free;
...
  if Assigned( lObject) then // неверная проверка, ибо переменная по прежнему ссылается на некий участок памяти

мне пришла мысль, что можно попытаться создать функцию, которая проверила бы реальное "положение дел".
и вот что у меня получилось после "курения" функции SysFreeMem:
Код

function CheckIsFreed( AObject: TObject ): Boolean;
var
  Signature: PLongInt;
  P: Pointer;
begin
  P := AObject;
  Result := P = nil;
  if Result then Exit;
  Signature := PLongInt(LongInt(P) - 4);
  Result := IsBadReadPtr( Signature, 4 ) or IsBadWritePtr( Signature, 4 );
  if result then Exit;
  Result := Signature^ = 1;
end;

не уверен, что она 100% соответствует ожиданиям, но:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  lSL : TStringList;
begin
  Integer(lSL) := 123123123;
  ShowMessage( BoolToStr( CheckIsFreed( lSL), True ));
  lSL := TStringList.Create;
  ShowMessage( BoolToStr( CheckIsFreed( lSL), True ));
  lSL.Free;
  ShowMessage( BoolToStr( CheckIsFreed( lSL), True ));
end;

отрабатывает верно...
правда если написать так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  lSL : TStringList;
begin
  Integer(lSL) := 123123123;
  ShowMessage( BoolToStr( CheckIsFreed( lSL), True ));
  lSL := TStringList.Create;
  ShowMessage( BoolToStr( CheckIsFreed( lSL), True ));
  lSL.Free;
  TStringList.Create;
  ShowMessage( BoolToStr( CheckIsFreed( lSL), True ));
end;

то последняя проверка "соврет", видимо вновь созданный TStringList попадет ровно в то место, где был предыдущий...

жду комментариев и дополнений от... всех сочувствующих)

Это сообщение отредактировал(а) MetalFan - 9.10.2007, 18:44


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Bose
Дата 9.10.2007, 19:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



У меня CheckIsFreed выдаёт False и после
lSL.Free;


т.е. ведёт себя точно также как и assigned.

Delphi 6(6.240 Update Pack 2)

Добавлено через 1 минуту и 51 секунду
Цитата(MetalFan @  9.10.2007,  18:43 Найти цитируемый пост)
Как известно, простое освобождение памяти объекта посредством TObject.Freeделает невозможным дальнейшее получение статуса(Создан/Освобожден) переменной-объекта стандартными способами.


Прочитал это, и не поверил сначала. Бросился проверять - оказывается правда. Как я паньше жил не зная этого smile 
Видно не зря у меня в коде повсюду  freeandnil используется  smile 
PM MAIL WWW Skype   Вверх
VICTAR
Дата 9.10.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Нда... MetalFan, к сожалению твоя функция не работает, как надо. D7 
PM MAIL   Вверх
MetalFan
Дата 9.10.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



VICTAR, а хоть как-то работает? тестил под D2006


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 9.10.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Гы! только что хотел спросить насчет 
Код

  Class.Free;
  Class.Free; //Почему ошибка

, а тут такая тема хорошая  smile 
Теперь буду юзать
Код

freeandnil 

А всетаки для чего делали программеры Free? Если она работает как Destroy?
У меня D7 - тоже Не работает.

Это сообщение отредактировал(а) Ak47black - 9.10.2007, 19:38
PM MAIL   Вверх
VICTAR
Дата 9.10.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



true
false
false
в обоих случаях

Добавлено через 2 минуты и 56 секунд
Цитата(Ak47black @  9.10.2007,  19:31 Найти цитируемый пост)
А всетаки для чего делали программеры Free? Если она работает как Destroy?

Free перед вызовом Destroy проверяет указатель на nil
PM MAIL   Вверх
MetalFan
Дата 9.10.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(VICTAR @  9.10.2007,  19:47 Найти цитируемый пост)
true
false
false
в обоих случаях

странно... наверное раньше менеджер памяти както по-другому работал


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
VICTAR
Дата 9.10.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Цитата(MetalFan @  9.10.2007,  19:55 Найти цитируемый пост)
странно... наверное раньше менеджер памяти както по-другому работал 

Возможно... 
Очень жаль, если нет универсального решения. Меня тоже давно уже мучал этот вопрос.
PM MAIL   Вверх
Alexeis
Дата 9.10.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



MetalFan, очевидно, что данный код сильно привязан к версии и нет ни какой гарантии, что в будущем это также сохраниться. ИМХО freeandnil, самое грамотное решение этого вопроса.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 9.10.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



ужас... смортю код SysMemFree в сeмерке... а там goto  smile 

Это сообщение отредактировал(а) MetalFan - 9.10.2007, 20:27


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 9.10.2007, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

ужас... смортю код SysMemFree в сeмерке... а там goto


Удивлен? А я почему-то нет  smile Не забывай, что это все же наследие паскаля, хоть и переработанное, но не переписанное с нуля...

А если по теме - то FreeAndNil не всегда можно использовать, к сожалению. Например, если создается поток, в котором FreeOnTerminate = True...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
dumb
Дата 10.10.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



Цитата(aktuba @  9.10.2007,  23:10 Найти цитируемый пост)
А если по теме - то FreeAndNil не всегда можно использовать, к сожалению. Например, если создается поток, в котором FreeOnTerminate = True...
мысль эту, откровенно говоря, я не уловил.
PM MAIL   Вверх
MetalFan
Дата 10.10.2007, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
dumb
Дата 10.10.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



MetalFan, это я понимаю. я не понял, зачем вообще использовать free(с nil и без него), если ставишь этот флаг... вобщем туго мысль с утра течет... smile
PM MAIL   Вверх
Alexeis
Дата 10.10.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



MetalFan, если идет определение состояния, но не нужно уничтожать его автоматом. Используется метод WaitFor, для ожидания завершения или состояние флага Terminated, для определения окончания работы, определили что Terminated = true, дождались полного завершения, потом уничтожили и занулили. Как я понимаю FreeOnTerminate ставят в случае когда время окончания не играет роли и важно только чтобы память была освобождена.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1229 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.