Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > EAccessViolation


Автор: Budy 17.5.2006, 18:26
:Приветствую
Есть код
Код
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 

Автор: Демо 17.5.2006, 18:42
Метод Free не присваивает nil переменной. См. процедуру FreeAndNil 

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

Assigned(F); 

Цитата

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

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

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

Автор: Budy 17.5.2006, 19:20
Демо, твой пример отлично робит, спасибо!

drkot, однако 
Код

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


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

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

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

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

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


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

Автор: Rouse_ 17.5.2006, 19:45
Цитата(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.
 

Автор: Budy 17.5.2006, 19:50
Rouse_, круто!

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

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

Так и есть. Хотя странно, почему компилер такой умный, что может заменять присваивание nil на Call @DynArrayClear для динамических массивов, но не может вызывать деструктор объекта.. ;)
(http://forum.sources.ru/index.php?showtopic=126478&p=955282&st=0&#)
Наверняка это сделано для простоты работы с объектными переменными, иначе было бы очень тяжело отследить, кто же кого дестроит.  smile 
А по указателю определить, валидный там объект, или нет - это отчасти похоже на работу unerase.. smile  Вспоминается функа IsWindow, которой проверяют, похоже ли то, что в этой области памяти хранится, на настоящее окно.. smile  IMHO, НЕРЕАЛЬНО, да и ни к чему это. Просто нужно так планировать связи в программе, чтоб любой кусок кода всегда был уверен, валиден тот или иной указатель, или нет, а не траить наобум, на SEH надеясь.. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)