Могу ли я использовать.Create(Nil) вместо.Create(Application)
У меня есть модуль с переменной TComponent, я создаю этот компонент при инициализации модуля следующим образом:
var
XComp: TComponent;
.
.
.
.
initialization
begin
XCom := TComponent.Create(Application);
end;
после установки модуля при закрытии Delphi выдается сообщение об ошибке Access Violation (EAccessViolation)
но когда я изменил своего создателя, чтобы быть следующим
initialization
begin
XCom := TComponent.Create(nil);
end;
все прошло нормально... Хотелось бы узнать разницу? а что лучше?
примечание: ошибка появляется только при закрытии delphi (значит во время разработки).
Благодарю.
2 ответа
По сути, оба допускаются, и это не должно приводить к AV, даже если у вас есть такой код:
MyComp := TMyComp.Create(Application);
try
{...}
finally
MyComp.Free;
end;
Это связано с тем, что правильно уничтоженный компонент удаляет себя из списка компонентов своего владельца при его уничтожении.
Я думаю, что проблема здесь может заключаться в том, что компонент уже был освобожден объектом приложения, а затем какой-то код пытается получить к нему доступ. Может быть, в вашем коде есть раздел финализации, который это делает? Или у вас могут быть смешанные объекты и интерфейсы и подсчет ссылок.
Чтобы устранить проблему, вы можете запустить IDE в отладчике, установив в качестве "хост-приложения" вашего пакета Delphi (C:\Program Files\\BDS\\Bin\bds.exe). и установите точку останова в деструкторе вашего компонента. Таким образом, вы узнаете, где оно освобождается, а также где происходит AV.
Когда вы используете
XCom := TComponent.Create(Application);
Приложение вы делаете владельцем XCom. Когда приложение закрывается, оно позаботится об уничтожении XCom, поскольку оно является его владельцем.
Когда вы делаете
XCom := TComponent.Create(nil);
никто не является владельцем XCom, и вы должны освободить его самостоятельно, когда приложение завершится.
Вы, вероятно, получили исключение, потому что вы вручную освободили XCom, а затем Application также попытался освободить XCom.