下面是对象的建立代码,
constructor TWorkData.Create(DbAc: TDbAc);
begin
inherited Create(DbAc);
FTableDict := TAdoQuery.Create(Application);
FTableDict.Connection := FDbac.DbConnection ;
FList := TList.Create ;
FQueryInfo := TQueryInfo.Create(FDbAc);
FBookMarks := TMarkContainer.Create ;
end;下面是释放的代码:
destructor TWorkData.Destory;
var i: integer;
begin
for i := 0 to FList.Count - 1 do
Dispose(FList.Items[i]); FList.Free ;
FTableDict.Free ;
FBookMarks.Destory ;
FQueryInfo.Destory ;
inherited;
end;上面的代码在昨天和以前一直工作正常(两个星期了),今天写了很久以后,
测试时突然发现在关闭系统时会报内存错误。将TWorkData.Create代码修改为
以下后正常constructor TWorkData.Create(DbAc: TDbAc);
begin
inherited Create(DbAc);
//改行修改,让其拥有者为NIl
FTableDict := TAdoQuery.Create(Nil);
FTableDict.Connection := FDbac.DbConnection ;
FList := TList.Create ;
FQueryInfo := TQueryInfo.Create(FDbAc);
FBookMarks := TMarkContainer.Create ;
end;我也知道TAdoQuery.Create(Nil)和TAdoQuery.Create(Application) 之间的区别。奇怪的是为什么以前正常,到今天就要修改后才行,原因是什么?
constructor TWorkData.Create(DbAc: TDbAc);
begin
inherited Create(DbAc);
FTableDict := TAdoQuery.Create(Application);
FTableDict.Connection := FDbac.DbConnection ;
FList := TList.Create ;
FQueryInfo := TQueryInfo.Create(FDbAc);
FBookMarks := TMarkContainer.Create ;
end;下面是释放的代码:
destructor TWorkData.Destory;
var i: integer;
begin
for i := 0 to FList.Count - 1 do
Dispose(FList.Items[i]); FList.Free ;
FTableDict.Free ;
FBookMarks.Destory ;
FQueryInfo.Destory ;
inherited;
end;上面的代码在昨天和以前一直工作正常(两个星期了),今天写了很久以后,
测试时突然发现在关闭系统时会报内存错误。将TWorkData.Create代码修改为
以下后正常constructor TWorkData.Create(DbAc: TDbAc);
begin
inherited Create(DbAc);
//改行修改,让其拥有者为NIl
FTableDict := TAdoQuery.Create(Nil);
FTableDict.Connection := FDbac.DbConnection ;
FList := TList.Create ;
FQueryInfo := TQueryInfo.Create(FDbAc);
FBookMarks := TMarkContainer.Create ;
end;我也知道TAdoQuery.Create(Nil)和TAdoQuery.Create(Application) 之间的区别。奇怪的是为什么以前正常,到今天就要修改后才行,原因是什么?
TAdoQuery.Create(nil)是有你自己释放资源FQueryInfo.Destory ;也不应该用 ,FQueryInfo.Free,原因你看看帮助就知道了
_______________________________________________________________________________
真奇怪你为什么写程序一会儿用Free来释放资源一会儿用Destory来释放?
_________________________________________________________________________________FQueryInfo是我自己定义类的实例,没有写Free方法,只写了Destory方法,因为在系统中释放前不需要判断对象是否存在。原因不在这儿,至于TAdoQuery.Create(Nil)和TAdoQuery.Create(Application) 之间的区别我知道,我想知道的是,为什么以前正常,今天不正常,到底在哪种情况下会导致不正常?