关于资源的释放

时间:2022-05-03 04:59:08
我想知道Delphi中关于如何释放资源的
比如说

procedure TDMMain.FillDicComboBox(aDBComboBox:TDBLookupComboBox;strFilter:string);
var
  datasource:TDataSource;
  aDataset:TADODataSet;
begin
  datasource:=TDataSource.Create(nil);
  aDataset:=Self.GetDataset('select Code,Name from Dictionary '
                             +'where Filter='+''''+strFilter+'''');
  datasource.DataSet:=aDataset;
  aDBComboBox.ListSource:=datasource;
  aDBComboBox.ListField:='Name';
  aDBComboBox.KeyField:='Code';
end;

我如果调用DMMain.FillDicComboBox(DBLookupComboBox1,'Country');
会不会有什么问题?(FillDicComboBox中的datasource/aDataset什么时候会释放啊?要我自己去释放么?)

还有,这样的代码可以么?ds会在什么时候释放掉啊?
function TDMMain.GetDataset(strSql:string):TADODataSet;
var
  ds:TADODataSet;
begin
  ds:=TADODataSet.Create(nil);
  try
  begin
    with ds do
    begin
      Connection:=Cnn;//Cnn为一打开的数据库连接
      CommandType:=cmdText;
      CommandText:=strSql;
      CursorLocation:=clUseClient;
      CursorType:=ctStatic;
      LockType:=ltBatchOptimistic;
      Open;
    end;
  end
  except
    on E:Exception do  MessageBox(0,Pchar(E.Message),'',MB_OK);
  end;
  Result:=ds;
end;

恳请赐教!

9 个解决方案

#1



这都要你手工释放。
Ds.Free;

#2



 XXX.Create(self) 
or
 XXX..Create(Application)
這類, 都可讓控件的parent 在釋放時, 同時釋放它們

#3


什么时候释放啊?在函数里释放??那不是没有返回值了么?

#4


但是
datasource:TDataSource;
  aDataset:TADODataSet;
都是在函数里动态创建的阿?他们的parent是谁啊?

#5


都是在函数里动态创建的阿?他们的parent是谁啊?
你用的是nil,没人帮你,你不用的时候就释放,比如退出的时候。

#6


第一个例子中DBLookupComboBox1被释放后,他的ListSource会自动释放掉么?

#7


miky(miky) 
退出的时候?你指的是函数退出的时候么?那我的GetDataset函数不是返回空值了么?

#8


你返回的对象总会赋给某一个变量吧。你直接释放这个变量不就完了。
如果你想要自动释放的话,一个是不要使用nil作为Owner,随便找一个都行的(比如Application)。或者使用接口,那样在你的接口对象引用计数为零的时候系统会自动释放它的。

#9


哦。明白了,结贴!

#1



这都要你手工释放。
Ds.Free;

#2



 XXX.Create(self) 
or
 XXX..Create(Application)
這類, 都可讓控件的parent 在釋放時, 同時釋放它們

#3


什么时候释放啊?在函数里释放??那不是没有返回值了么?

#4


但是
datasource:TDataSource;
  aDataset:TADODataSet;
都是在函数里动态创建的阿?他们的parent是谁啊?

#5


都是在函数里动态创建的阿?他们的parent是谁啊?
你用的是nil,没人帮你,你不用的时候就释放,比如退出的时候。

#6


第一个例子中DBLookupComboBox1被释放后,他的ListSource会自动释放掉么?

#7


miky(miky) 
退出的时候?你指的是函数退出的时候么?那我的GetDataset函数不是返回空值了么?

#8


你返回的对象总会赋给某一个变量吧。你直接释放这个变量不就完了。
如果你想要自动释放的话,一个是不要使用nil作为Owner,随便找一个都行的(比如Application)。或者使用接口,那样在你的接口对象引用计数为零的时候系统会自动释放它的。

#9


哦。明白了,结贴!