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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EAccessViolation, F.Free; (F=nil)=FALSE!!! 
V
    Опции темы
Budy
Дата 17.5.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



:Приветствую
Есть код
Код
procedure TForm1.FormCreate(Sender: TObject);
var
  F: TForm;
begin
  F:=TForm.Create(Self);
  F.Free;
  if(F<>nil)then
    F.Free; //Здесь вылетает "EAccessViolation"
end;

Поидее в первый раз F свободно удаляется и должен быть равен nil.  Или?
Может есть другая проверка удаленного объекта?
Заранее спасибо

Добавлено @ 18:31 
А можно ли удалить объект до nil? smile 

Это сообщение отредактировал(а) Budy - 17.5.2006, 18:27


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
Демо
Дата 17.5.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



Метод Free не присваивает nil переменной. См. процедуру FreeAndNil 


--------------------
    
PM MAIL ICQ Skype   Вверх
drkot
Дата 17.5.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

Репутация: 5
Всего: 8



Цитата(Budy @  17.5.2006,  18:26 Найти цитируемый пост)
Может есть другая проверка удаленного объекта?

Assigned(F); 

Цитата

А можно ли удалить объект до nil?

Поясни что этим хочеш сказать. 

Это сообщение отредактировал(а) drkot - 17.5.2006, 19:03


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Rouse_
Дата 17.5.2006, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 29



drkot, это ничего не даст... К сожалению так уж устроена модель VCL, причем у разрушенного обьекта даже можно будет прочитать некоторые свойства которые возвращаются напрямую из переменной, AV получиться при обращении к любому методу разрушенного объекта. 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Budy
Дата 17.5.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Демо, твой пример отлично робит, спасибо!

drkot, однако 
Код

F.Free;  //Assigned(F)=True


Rouse_, хм.. интересно. Спасибо.

А как насчет простоого присвоения nil? 


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
Rouse_
Дата 17.5.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 29



Цитата(Budy @  17.5.2006,  20:20 Найти цитируемый пост)
А как насчет простоого присвоения nil?  

FreeAndNil разрушает и обниливает указатель на экземпляр класса. Если ты создашь обьект и присвоишь ему NIL то ты просто потеряешь указатель на созданный обьект и не сможешь к нему обращаться, но сам по себе он будет существовать и занимать память. Налицо будет эффект, называемый Memory Leack - тобишь по итальянски "утечка памяти" smile 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
drkot
Дата 17.5.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

Репутация: 5
Всего: 8



Цитата(Rouse_ @  17.5.2006,  19:04 Найти цитируемый пост)
drkot, это ничего не даст


Rouse_, 
  проверю. незнал.  
  по мануалу она для этого и задумана. 

Это сообщение отредактировал(а) drkot - 17.5.2006, 19:41


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Rouse_
Дата 17.5.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 29



Цитата(drkot @  17.5.2006,  20:40 Найти цитируемый пост)
по мануалу она для этого и задумана. 

По мануалу она создана для проверки наличия необниленногу указателя или ссылки на процедуру, о чем мануал нам с детской непосредственностью и вещает  smile 
Цитата

Use Assigned to determine whether the pointer or procedure referenced by P is nil. P must be a variable reference of a pointer or procedural type. Assigned(P) corresponds to the test P<> nil for a pointer variable, and @P <> nil for a procedural variable.
 
Assigned returns false if P is nil, true otherwise.
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Budy
Дата 17.5.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Rouse_, круто!

Всем спасибо. Вопрос решен! 


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
Mechanic
Дата 18.5.2006, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(Rouse_ @  17.5.2006,  19:29 Найти цитируемый пост)
Если ты создашь обьект и присвоишь ему NIL то ты просто потеряешь указатель на созданный обьект и не сможешь к нему обращаться, но сам по себе он будет существовать и занимать память.

Так и есть. Хотя странно, почему компилер такой умный, что может заменять присваивание nil на Call @DynArrayClear для динамических массивов, но не может вызывать деструктор объекта.. ;)
(присваивание nil динамическому массиву детально)
Наверняка это сделано для простоты работы с объектными переменными, иначе было бы очень тяжело отследить, кто же кого дестроит.  smile 
А по указателю определить, валидный там объект, или нет - это отчасти похоже на работу unerase.. smile  Вспоминается функа IsWindow, которой проверяют, похоже ли то, что в этой области памяти хранится, на настоящее окно.. smile  IMHO, НЕРЕАЛЬНО, да и ни к чему это. Просто нужно так планировать связи в программе, чтоб любой кусок кода всегда был уверен, валиден тот или иной указатель, или нет, а не траить наобум, на SEH надеясь.. 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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