メモリ管理規則
インターフェイスへのポインターの有効期間は常に、すべての COM インターフェイスの AddRef および Release メソッドによって管理されます。 詳細については、「参照カウント を管理するためのルール」を参照してください。
その他のすべてのパラメーターについては、メモリを管理するための特定の規則に従うことが重要です。 次の規則は、値渡しされない戻り値を含む、インターフェイス メソッドのすべてのパラメーターに適用されます。
- インパラメーターは、呼び出し元によって割り当てられ、解放される必要があります。
- 出力パラメーターは、呼び出されたパラメーターによって割り当てられる必要があります。これらは、標準の COM タスク メモリ アロケーターを使用して呼び出し元によって解放されます。 詳細については、「OLE メモリ アロケーター」を参照してください。
- In/out パラメーターは、最初は呼び出し元によって割り当てられ、必要に応じて呼び出されたパラメーターによって解放され、再割り当てされます。 out パラメーターの場合と同様に、呼び出し元は最終的な戻り値を解放する必要があります。 標準の COM メモリ アロケーターを使用する必要があります。
後者の 2 つのケースでは、1 つのコードでメモリが割り当てられ、別のコードによって解放されます。COM アロケーターを使用すると、2 つのコードで同じ割り当て方法が使用されます。
特に注意が必要なもう 1 つの領域は、故障状態でのアウトパラメーターとインアウト パラメーターの処理です。 関数がエラー コードを返す場合、呼び出し元には通常、out パラメーターまたは in-out パラメーターをクリーンアップする方法はありません。 これにより、次の追加ルールが作成されます。
- エラー状態が発生した場合、パラメーターは常に、呼び出し元によるアクションなしでクリーンアップされる値に確実に設定する必要があります。
- すべての出力ポインター パラメーターは、NULL 明示的に設定する必要があります。 これらは通常、ポインターからポインターへのパラメーターで渡されますが、呼び出し元が割り当て、呼び出されたコードが塗りつぶす構造体のメンバーとして渡すこともできます。 これを確実に行う最も簡単な方法は、これらの値を関数エントリで NULL 設定することです。 この規則は、より堅牢なアプリケーションの相互運用性を促進するため、重要です。
- エラー状態では、out パラメーターエラーの戻り値のように、すべてのインアウト パラメーターを呼び出されたコードによって単独にするか (したがって、呼び出し元によって初期化された値に残る) か、明示的に設定する必要があります。
COM アプリケーションに対するこれらのメモリ管理規則は、パブリック インターフェイスと API 間でのみ適用されることに注意してください。COM アプリケーションに対して厳密に内部的にメモリ割り当てを行う必要がある場合、これらのメカニズムを使用する必要はありません。
COM は、クライアントとサーバー間の通信にリモート プロシージャ コール (RPC) を内部的に使用します。 RPC サーバー スタブでのメモリ管理の詳細については、「Server-stub Memory Management」トピックを参照してください。
関連トピック
- メモリ割り当て の管理