请教关于destroy的错误问题﹐内详﹗﹗(50分)

  • 主题发起人 主题发起人 Grof
  • 开始时间 开始时间
G

Grof

Unregistered / Unconfirmed
GUEST, unregistred user!
//ini file buffer
Fini: Tinifile;
Lini: TiniFile;


destructor TeDictionary.Destroy;
begin
if assigned(fini)
then fini.free;
if assigned(lini)
then Lini.Free;
Inherited;
end;

最近在调适程序的时候;
在form关闭时,出现地址读写错误,请高人指教.

"Project job.exe raised exception class EAccessViolation with message 'Access violation at address 0121F040.write of address C810BA9A'.Process stopped.
 
Fini: Tinifile;
Lini: TiniFile;
在使用前应:
Fini:=Nil;
Lini:=Nil;
 
释放的时候最好也顺便赋值为nil。
FINI和LINI不是类成员变量,不会自动初始化为nil的。assigned其实就是判断是否是nil。
 
請問,上述的錯誤一般會在身麼情況下發生?
另,上面二位的方法(赋值为nil),好像不管用.
 
改成这样:
//ini file buffer
Fini: Tinifile = nil;
Lini: TiniFile = nil;
 
能解释一下吗?这样的解释很不清晰﹐而且你的方法好象不行。
 
Fini: Tinifile = nil;
Lini: TiniFile = nil;

destructor TeDictionary.Destroy;
begin
FreeAndNil(fini);
FreeAndNil(lini);
Inherited;
end;

 
好像不行?——除非你反复创建和释放。
只要记住一个原则就行了:某个对象开始初始化为nil,释放后也顺便把这个对象:=nil.就安全多了。
 
Fini: Tinifile;
Lini: TiniFile;
如果是类字段,会初始化为nil。如果是单元变量,不会自动初始化的。
谁拥有谁负责。如果是单元变量,那么在Initialization/Finialization.
 
后退
顶部