Object.Create(nil) not necessary?



为什么如果我跳过对象创建,我的代码仍然有效? 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:tempMyFolder';
  AbUnzipper1.ExtractOptions := [eoCreateDirs, eoRestorePath];
  AbUnzipper1.ExtractFiles('*');
  AbUnZipper1.Free;
end;

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

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

如果您的程序运行没有错误,那么这是偶然的。在此过程中,您可能会在其他地方

损坏内存。

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

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

最新更新