最近我有一个dillema.
考虑这样的例子:
unit Unit2;
interface
uses
Classes;
type
TMyObject = class(TObject)
private
FDataStream: TMemoryStream;
procedure SetDataStream(const Value: TMemoryStream);
public
property DataStream: TMemoryStream read FDataStream write SetDataStream;
constructor Create(ADataStream: TMemoryStream);
destructor Destroy;
end;
implementation
{ TMyObject }
constructor TMyObject.Create(ADataStream: TMemoryStream);
begin
FDataStream := ADataStream;
end;
destructor TMyObject.Destroy;
begin
//Should MyObject free FDataStream?
end;
procedure TMyObject.SetDataStream(const Value: TMemoryStream);
begin
FDataStream := Value;
end;
end.
Run Code Online (Sandbox Code Playgroud)
如您所见,TMyObject可以有一个TMemoryStream实例.现在,我想知道TMyobject在被释放时应该做什么?它是否还应该释放FDataStram还是它应该保留原样?
这样的场景是否有任何指导?
谢谢.
Mar*_*ema 10
在示例中,您似乎在我看来,您的TMyObject从其他地方接收实例.如果它不在TMyObject构造函数中来接管它收到的流的所有权,那么当它被销毁时肯定不会释放它.
为了保持你的理智,坚持这个规则:实例化一个对象的类/代码应该销毁它.
并且由于您的构造函数不创建数据流实例,因此析构函数不应释放它.