オブジェクトとしてパラメータを持つメソッドがあります(以下の狙撃コード):
TMyObject=class(TObject)
constructor Create();
destructor Destroy();override;
end;
implementation
function doSomething(x:TMyObject):integer;
begin
//code
end;
procedure test();
var
w:integer;
begin
w:=doSomething(TMyObject.Create);
//here: how to free the created object in line above?
end;
どのように呼び出されるメソッドのオブジェクトを作成内部破壊のdoSomethingのこのメソッドの外では?
オブジェクトインスタンスを解放するには、を呼び出すことができるオブジェクトインスタンスへの参照が必要ですFree()
。
オブジェクトインスタンスをパラメータとしてインプレースで作成しているため、参照できるのはdoSomething()
パラメータ内の参照だけです。
あなたはどちらかをFree
内部で行う必要がありますdoSomething()
(これは私が行うことをお勧めしない練習です):
function doSomething(x: TMyObject): Integer;
begin
try
//code
finally
x.Free;
end;
end;
または、で追加の変数を作成しtest()
、に渡してdoSomething()
、戻り値のFree
後にそれを渡す必要がありdoSomething()
ます。
procedure test();
var
w: Integer;
o: TMyObject
begin
o := TMyObject.Create;
try
w := doSomething(o);
finally
o.Free;
end;
end;
参照カウントオブジェクトを使用すると、オブジェクトをインプレースで作成し、参照カウントでオブジェクトを解放できると思われるかもしれませんが、次のコンパイラの問題により、この種の構造は機能しない場合があります。
コンパイラは、新しく作成されたオブジェクトインスタンスをconstインターフェイスパラメータとして直接渡すときに、非表示の参照を保持する必要があります
これは、元EmbarcaderoコンパイラエンジニアのBarry Kellyによって、StackOverflowの回答で確認されています。
オブジェクトインスタンスをconstインターフェイスパラメータとして直接渡す場合、コンパイラはヒント/警告を表示する必要がありますか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加