2012-11-16 21 views
7

私はComPtr(Microsoft :: WRL)を使ってDirectX11のリソースを管理しています。 どうすれば手動で解除できますか?ComPtrを手動で解放する

「ReleaseAndGetAddressOf」メソッドが正しく理解されている場合、返されるリソース自体ではなくポインタだけが解放され、「リセット」メソッドについてはわかりません。

私が考えることのできる唯一の選択肢は、手動でポインタデストラクタを呼び出すことです。または、 "ReleaseAndGetAddressOf"から未処理のポインタを取得した後、その上で "Release"を呼び出すことです。

+0

ReleaseAndGetAddressOf()の説明が正しくありません。リソースを解放し、別のポインタ値を格納できるラップされたポインタのアドレスを返します。 「コール・リリース」は「プログラムをクラッシュさせようとしている現在のダンピング・ポインタでコール・リリース」と書かれているはずです。 –

答えて

16

WRLのソースコードが提供されています。include/winrt/wrl/client.hを見てください。埋め込みCOMポインタ(ptr_メンバ)は、InternalRelease()関数によって解放されます。ポインタを適切な候補から解放するには、次のいずれかを行います。

  • デストラクタ。その理由は、長い道のりが周り
  • リセット()を呼び出す)(ReleaseAndGetAddressOfを使用して
  • をnullptr割り当てる

だからnullptrを割り当てるか、リセットを呼び出す()良いフィット感ですComPtr <>

  • を使用するには好きなのを選びな。また、インターフェイスポインタを自分で管理したい場合は、まったく使用しないでください。ComPtrを使用する必要はありません。

  • +0

    詳細な説明ありがとうございます。私は実際にスマートポインタを使用することで利益を得ることができますが、場合によっては、ラッパークラスを維持しながら内部リソースをアンロードする必要があります。 –

    +0

    ReleaseAndGetAddressOf() - > Release()もコンパイルされません。 (* instance.ReleaseAndGetAddressOf()) - > Release()がクラッシュしました。 あなたの答えからそれを削除してください。 –

    3

    ヌルポインタを割り当てることができます。

    +0

    ありがとう、私が望むほど簡単! –

    関連する問題