4

はい、実際には「または」です。説明します。DirectXToolKit などのヘルパー クラスを自分で開発しています。COM の管理には、Microsoft::WRL::ComPtr< T > (wrl.h)を使用しています。

struct Renderer
{
    ComPtr<ID3D11Device> m_Device;
    ComPtr<ID3D11DeviceContext> m_ImmContext;
}

すべてのリソースが破棄されると、上記の構造体のインスタンスも破棄されるはずですが、dtor が呼び出された後、デバイスを解放しようとすると、Microsoft::WRL::ComPtr< T >でエラーが発生します。またはコンテキスト。

m_Device と m_ImmContext を手動で解放する dtor を実装しましたが、残念ながら、解放しようとする最後のメンバーは常に関数で問題が発生します。

unsigned long InternalRelease() throw()
{
    unsigned long ref = 0;
    T* temp = ptr_;

    if (temp != nullptr)
    {
        ptr_ = nullptr;
        ref = temp->Release();
    }

    return ref;
}

ここ

ref = temp->Release();

最初にデバイスの解放に成功すると、コンテキストがエラーをトリガーし、その逆も同様です (! はい、デバイスの 1 つが正常に解放された場合、2 番目のメンバーの破棄は失敗します)。私のような質問 ( directx デバイスとスワップ チェーンを破棄する ) が既にありましたが、他の dx リソースと同様に、ウィンドウとスワップ チェーンは既に破棄されています。なぜこれが起こっているのか分かりません。何か案は?

私の不完全な英語でごめんなさい:3

4

2 に答える 2

3

この問題を修正しました。問題は、私がstd::shared_ptrを十分に理解していなかったことです (関数std::make_shared (共有ポインタとその割り当てについて)):

次のようなポインターを作成しました。

Obj *ObjPtr = new Obj();

そしてちょうど:

SomeOtherState.SharedObj = std::make_shared<Obj>(*ObjPtr);

その後、ObjPtrを破棄しませんでした。ObjPtrが指していたデータは、 SomeOtherStateが破棄された後もメモリ内にありました (私が理解している限りでは、 std::shared_ptr ctor を使用していれば、問題も同様に発生するはずです)。

ほとんどの場合、このメモリ リークが原因でしたが、別の変更がありました:最後の COM ポインターが破棄される前にCoUninitialize呼び出しが行われましたが、 MSDNから:

現在のスレッドの COM ライブラリを閉じ、スレッドによって読み込まれたすべての DLL をアンロードし、スレッドが保持している他のすべてのリソースを解放し、スレッド上のすべての RPC 接続を強制的に閉じます。

そのため、 CoInitializeCoUninitializeを対応して置き換えたところ、問題は解決しました。誰かが同じ問題を抱えていた場合、これは多少の解決策になる可能性があります (私が行った最初と 2 番目の変更のいずれかまたは両方)。

おそらく、質問に「com」タグを追加する必要があります

于 2013-03-17T20:03:28.827 に答える
0

ImmediateContext を取得するときに、どこかに問題がある可能性があります。ドキュメントによると: http://msdn.microsoft.com/en-us/library/windows/desktop/ff476529%28v=vs.85%29.aspx

The GetImmediateContext method increments the reference count of the immediate
context by one. Therefore, you must call Release on the returned interface pointer
when you are done with it to avoid a memory leak. 

だから私は>>>推測<<<どこかでコンテキストを解放するのを忘れたので、後でデバイスの解放が失敗します。

ところで:リソースが常に逆の順序で解放されることも確認してください。

于 2013-03-17T14:20:14.683 に答える