下面是对象的建立代码,
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) 之间的区别。奇怪的是为什么以前正常,到今天就要修改后才行,原因是什么?

解决方案 »

  1.   

    我也发现这个问题只要在非窗体单元就会有这种情况这试着在initialization 与 finalization 里面写初始化代码也会如此不知什么原因
      

  2.   

    TAdoQuery.Create(Application) 是有应用程序帮你释放资源,
    TAdoQuery.Create(nil)是有你自己释放资源FQueryInfo.Destory ;也不应该用 ,FQueryInfo.Free,原因你看看帮助就知道了
      

  3.   

    真奇怪你为什么写程序一会儿用Free来释放资源一会儿用Destory来释放?
      

  4.   

    FQueryInfo.Destory ;也不应该用 ,FQueryInfo.Free,原因你看看帮助就知道了
    _______________________________________________________________________________
    真奇怪你为什么写程序一会儿用Free来释放资源一会儿用Destory来释放?
    _________________________________________________________________________________FQueryInfo是我自己定义类的实例,没有写Free方法,只写了Destory方法,因为在系统中释放前不需要判断对象是否存在。原因不在这儿,至于TAdoQuery.Create(Nil)和TAdoQuery.Create(Application) 之间的区别我知道,我想知道的是,为什么以前正常,今天不正常,到底在哪种情况下会导致不正常?