質問

すべてのD3Dインタフェース由来のCOMのIUnknownインタフェースでいう容易なルートを公開D3D物のものを使っておけば間違いないようになります:

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

    pUnknown = NULL;
    return TRUE;
}

この動作しないものとしてコンパイラが生まれの無効なタイプの変換エラー(s)、写真撮影のポイントにご案内してます。唯一の方法で思いったこ

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

    return TRUE;
} 

そこでゆったりいくつかの機能でも見えるが)非常に危.あると良い。この作品のように私の最初の例では最適かどうかがうなずマクロの場合はその可能)

役に立ちましたか?

解決

Aテンプレート機能は、あなたの問題を解決します:

template<class T>
__inline bool SafeRelease(T*& pUnknown)
{
    if (pUnknown == NULL) return false;
    if (0 == pUnknown->Release()) 
        pUnknown = NULL;
    return true;
}

他のヒント

一般的に取りルートに対COM資源をrau-α(やましょうヘルパークラスのようにATLs CComPtr または CComQIPtr ハリファレンスカウンターのご使用を推奨させていただく限り可能です。

void f() {
    CComPtr<IDirect3DDevice> sp3dDev;
    getDevice(&sp3dDev);
    // ... do stuff
} // smart pointer gets destroyed, calls Release() if valid

あなたはもともと書いたものを行うことができた場合、あなたは型の安全性に違反します:

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

は明らかに、barunknownの割り当てタイプの安全性に違反するblah、へのIUnknown点を意味する。

nobugzのソリューションには、Iでしょうが、あなたが何をしたいか考えられますNULLにこれらのポインタを設定すると、コードの品質を増加させないと主張しています。あなたは他のコードが複数回Releaseないことを確認する必要がある場合は、おそらくバグだらけのコードが失敗しないコードではなくなっていることを修正しに行く必要があります。

私はしばらくのDirectXで働いていないが、私はそれのヘッダーにSAFE_RELEASEマクロどこかを持って覚えています。それはdxutil.hでのGoogleコード検索を示します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top