Object.Create(nil)不必要吗?

时间:2019-04-17 03:42:12

标签: delphi

为什么如果我跳过对象创建,我的代码仍在工作? AbUnzipper1.FileName := 'C:\MyFile.zip';永远不会在运行时引发访问冲突。

此(简化的)代码来自DLL,没有用于放置组件的形式。

uses AbArcTyp, AbUnZper,...
...
var
  AbUnZipper1: TAbUnZipper;
begin
  // AbUnZipper1 := TAbUnZipper.Create(nil);  COMMENTED !!!!!!!!
  AbUnzipper1.FileName := 'C:\MyFile.zip';
  AbUnzipper1.BaseDirectory := 'C:\temp\MyFolder';
  AbUnzipper1.ExtractOptions := [eoCreateDirs, eoRestorePath];
  AbUnzipper1.ExtractFiles('*');
  AbUnZipper1.Free;
end;

1 个答案:

答案 0 :(得分:2)

您的代码AbUnZipper1是未定义的引用(即指针)。访问时的行为是不确定的。它可能指向有效内存,或者可能指向无效内存。

如果是后者,则当您尝试使用引用时,将遇到运行时错误,即访问冲突。如果是前者,那么您将成功访问内存,但是该内存属于程序中的其他内容,您将破坏它。

如果您的程序运行没有错误,那就是偶然的。在此过程中,您可能会破坏内存。

您的代码是错误的,您应该通过恢复AbUnZipper1 := TAbUnZipper.Create(nil)来解决它。

您还应该确保在此代码中使用try / finally,以避免在发生异常情况时发生内存泄漏。