Могу ли я использовать.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.

Другие вопросы по тегам