为什么如果我跳过对象创建,我的代码仍在工作?
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;
答案 0 :(得分:2)
您的代码AbUnZipper1
是未定义的引用(即指针)。访问时的行为是不确定的。它可能指向有效内存,或者可能指向无效内存。
如果是后者,则当您尝试使用引用时,将遇到运行时错误,即访问冲突。如果是前者,那么您将成功访问内存,但是该内存属于程序中的其他内容,您将破坏它。
如果您的程序运行没有错误,那就是偶然的。在此过程中,您可能会破坏内存。
您的代码是错误的,您应该通过恢复AbUnZipper1 := TAbUnZipper.Create(nil)
来解决它。
您还应该确保在此代码中使用try / finally
,以避免在发生异常情况时发生内存泄漏。