1

すべての D3D インターフェイスは COM の IUnknown インターフェイスから派生しているため、D3D オブジェクトを解放するには簡単な方法を使用し、次のようなものを使用します。

__inline BOOL SafeRelease(IUnknown*& pUnknown)
{
    if(pUnknown != NULL && FAILED(pUnknown->Release()))
        return FALSE;

    pUnknown = NULL;
    return TRUE;
}

ただし、使用しようとするとコンパイラが無効な型変換エラーを生成するため、これは機能しません。私が考えることができる唯一の方法はこれでした:

__inline BOOL SafeRelease(void* pObject)
{
    IUnknown* pUnknown = static_cast<IUnknown*>pObject;
    if(pUnknown != NULL && FAILED(pUnknown->Release()))
        return FALSE;

    return TRUE;
} 

しかし、その後、いくつかの機能が失われ、見た目も非常に危険です。これを行うより良い方法はありますか?私の最初の例のように機能するものが最適ですが、マクロの使用は避けたいです(可能な場合)

4

4 に答える 4

4

COM リソースを処理するための一般的な方法は、RAII を採用し、ATLCComPtrなどのヘルパー クラスCComQIPtrにできる限り参照カウントを処理させることです。

void f() {
    CComPtr<IDirect3DDevice> sp3dDev;
    getDevice(&sp3dDev);
    // ... do stuff
} // smart pointer gets destroyed, calls Release() if valid
于 2010-02-28T09:23:13.787 に答える
3

テンプレート関数はあなたの問題を解決します:

template<class T>
__inline bool SafeRelease(T*& pUnknown)
{
    if (pUnknown == NULL) return false;
    if (0 == pUnknown->Release()) 
        pUnknown = NULL;
    return true;
}
于 2010-02-28T08:55:07.553 に答える
0

最初に書いたことを実行できる場合は、型の安全性に違反します。

IDirect3DDevice *blah;
IUnknown *bar;
IUnknown *&unknown= blah;
unknown= bar;

bar明らかに、への代入は、タイプ セーフに違反するを指すことunknownを意味します。blahIUnknown

nobugz の解決策はおそらくあなたがやりたいことですが、これらのポインターを NULL に設定してもコードの品質は向上しないと私は主張します。他のコードがRelease何度も失敗しないようにする必要がある場合は、バグのあるコードが失敗しないようにするのではなく、おそらくそのコードを修正する必要があります。

于 2010-02-28T09:00:49.843 に答える
0

しばらく DirectX を使用していませんでしたが、SAFE_RELEASEヘッダーのどこかにマクロが含まれていることを覚えています。Google コード検索は、それが にあることを示していますdxutil.h

于 2010-02-28T09:04:11.390 に答える