假设接口定义:
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类的实例?
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类的实例?
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更好。