Share via


メモリ管理規則

インターフェイスへのポインターの有効期間は常に、すべての COM インターフェイスの AddRef および Release メソッドを介して管理されます。 詳細については、「参照カウントを管理するためのルール」を参照してください。

その他のすべてのパラメーターについては、メモリを管理するための特定の規則に従うことが重要です。 次の規則は、値渡しされない戻り値を含む、インターフェイス メソッドのすべてのパラメーターに適用されます。

  • in パラメーターは、呼び出し元によって割り当てられ、解放される必要があります。
  • out パラメーターは、呼び出されたパラメーターによって割り当てられる必要があります。これらは、標準の COM タスク メモリ アロケーターを使用して呼び出し元によって解放されます。 詳細については、「OLE メモリ アロケーター」を参照してください。
  • in/out パラメーターは、最初は呼び出し元によって割り当てられ、必要に応じて呼び出されたパラメーターによって解放され、再割り当てされます。 out パラメーターの場合と同様に、呼び出し元は最終的な戻り値を解放する必要があります。 標準の COM メモリ アロケーターを使用する必要があります。

後者の 2 つのケースでは、1 つのコードでメモリが割り当てられ、別のコードによって解放されます。COM アロケーターを使用すると、2 つのコードで確実に同じ割り当て方法が使用されます。

特に注意が必要なもう 1 つの領域は、エラー状態での out と in-out パラメーターの処理です。 関数によってエラー コードが返される場合、呼び出し元には通常、out や in-out パラメーターをクリーンアップする方法はありません。 これにより、次の追加規則が生じます。

  • エラー状態が発生した場合、パラメーターは常に、呼び出し元によるアクションなしでクリーンアップされる値に確実に設定する必要があります。
  • すべての out ポインター パラメーターは、明示的に NULL に設定する必要があります。 これらは通常、ポインターからポインターへのパラメーターで渡されますが、呼び出し元が割り当て、呼び出されたコードで塗りつぶされる構造体のメンバーとして渡すこともできます。 これを確実に行う最も簡単な (1 つの) 方法は、これらの値を関数エントリで NULL に設定することです。 この規則は、より堅牢なアプリケーションの相互運用性を促進するため、重要です。
  • エラー状態では、out パラメーター エラー通知の場合のように、すべての in-out パラメーターを呼び出されたコードでそのまま (したがって、呼び出し元によって初期化された値のまま) にしておくか、明示的に設定する必要があります。

COM アプリケーションに対するこれらのメモリ管理規則は、パブリック インターフェイスと API 間でのみ適用されることに注意してください。COM アプリケーションに対して厳密に内部的にメモリ割り当てを行う必要がある場合、これらのメカニズムを使用する必要はありません。

COM では、クライアントとサーバー間の通信にリモート プロシージャ コール (RPC) が内部的に使用されます。 RPC サーバー スタブでのメモリ管理の詳細については、「サーバー スタブ メモリ管理」トピックを参照してください。