假设接口定义:
  IDataInterface = interface
    function ReturnMoudleDescr():string; //返回模块说明
  end;实现类:
  TDataInfor = class(TInterfacedObject,IDataInterface)
  private
    DCon:TADOConnection;
    DData:TADODataSet;
  public
    constructor Create(ConnectString:string);
    destructor Destory;override;
  end;实现:
constructor TDataInfor.Create(ConnectString: string); 
begin
  CoInitialize(nil);
  DCon:=TADOConnection.Create(nil);
  DCon.LoginPrompt :=false;
  DCon.ConnectionString :=ConnectString;
  DData:=TADODataSet.Create(nil);
  DData.Connection :=MasterCon;
end;destructor TDataInfor.Destroy;
begin
  if DCon.Connected then
    DCon.Close;
  CoUninitialize();
  DCon.Free;
  DCon:=nil;
  DData.Free;
  DData:=nil;
end;function TDataInfor.ReturnMoudleDescr():string;
begin
  DData.Close;
  DData.Commandtext:='SELECT DESCR FROM DESCRINFOR'; 
  DData.Open;
  Result:=DData['DESCR']; 
end;使用接口:
var
  MyData:IDataInterface;
  strDescr:string;
begin
  try
    MyData:=TDataInfor.Create('......');
    strDescr:=MyData.ReturnMoudleDescr();
  finally
    MyData:=nil; //销毁
  end;
end;问题如下:
接口实例由TDataInfor类生成,但最后MyData:=nil时,TDataInfor实例并没有执行Free销毁动作,也就是没有调用Destory,请问此时如何释放TDataInfor类的实例?

解决方案 »

  1.   

    MyData:=nil并不会调用DESTORY啊。用FREE才对。
      

  2.   

    from vclconstructor TObject.Create;
    begin
    end;
    destructor TObject.Destroy;
    begin
    end;
    procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;
    应该能看明白吧, MyData := nil 只是将一个指针清空,但指针原先所指的东西还在内存中。所以不会调用destroy的。
    我作了个小试验:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    form1:=nil  ;
    showmessage(form1.caption) //无异常,只不过显示的为空,因为此时form1指向为空
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    form1.Free;
    showmessage(form1.caption) //异常,form1指针并不等于nil,但其指向的东西已不存在,因此异常。
    end;因此应该要调用free,调用freeandnil更好。
      

  3.   

    我估计 MyData:=TDataInfor.Create('......') as IDataInterface;的话就没有问题