タグ付けされた質問 「delphi-2010」

2
暗黙的なインターフェース変数のコンパイラー処理は文書化されていますか?
少し前に、暗黙のインターフェイス変数について同様の質問をしました。 この質問の原因は、コンパイラによって作成された暗黙のインターフェイス変数の存在を認識していなかったため、コードのバグでした。この変数は、それを所有するプロシージャが終了したときに確定されました。これにより、変数の存続期間が予想よりも長くなるため、バグが発生しました。 これで、コンパイラの興味深い動作を説明する簡単なプロジェクトができました。 program ImplicitInterfaceLocals; {$APPTYPE CONSOLE} uses Classes; function Create: IInterface; begin Result := TInterfacedObject.Create; end; procedure StoreToLocal; var I: IInterface; begin I := Create; end; procedure StoreViaPointerToLocal; var I: IInterface; P: ^IInterface; begin P := @I; P^ := Create; end; begin StoreToLocal; StoreViaPointerToLocal; end. StoreToLocalあなたが想像するようにコンパイルされます。I関数の結果であるローカル変数は、暗黙のvarパラメーターとしてに渡されますCreate。片付けを行うStoreToLocalと、への呼び出しが1回になりますIntfClear。そこに驚きはありません。 ただし、StoreViaPointerToLocal扱いは異なります。コンパイラは、に渡す暗黙のローカル変数を作成しCreateます。にCreate戻ると、への割り当てP^が実行されます。これにより、インターフェイスへの参照を保持する2つのローカル変数がルーチンに残ります。片付けを行うStoreViaPointerToLocalと、への呼び出しが2回行われIntfClearます。 のコンパイル済みコードStoreViaPointerToLocalは次のようになります。 ImplicitInterfaceLocals.dpr.24: …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.