为什么如果我跳过对象创建,我的代码仍然有效? 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
以避免在发生异常时发生内存泄漏。