Domanda

tutte le D3D interfacce sono derivati da COM interfaccia IUnknown, così ho pensato che vorrei prendere un percorso facile per il rilascio di D3D oggetti e usare qualcosa come questo:

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

    pUnknown = NULL;
    return TRUE;
}

questo non funziona se, come il compilatore genererà non valido errore di conversione del tipo(s), quando cerco di usarlo.l'unico modo intorno ad esso che riuscivo a pensare era questo:

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

    return TRUE;
} 

ma poi ho perso un po ' di funzionalità ed inoltre sembra(ed è) molto dubbia.c'è un modo migliore per fare questo?qualcosa che funziona come il mio primo esempio potrebbe essere ottimale, anche se vorrei evitare l'uso di qualsiasi macro(se è possibile)

È stato utile?

Soluzione

Un modello di funzione risolve il tuo problema:

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

Altri suggerimenti

Comunemente adottate percorso per affrontare COM risorse da impiegare RAII e lasciare che le classi di supporto, come l'ATLs CComPtr o CComQIPtr gestire il conteggio dei riferimenti per voi, per quanto possibile.

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

Se si potesse fare quello che hai scritto, allora si sarebbe violare la sicurezza del tipo:

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

Chiaramente, l'assegnazione di bar per unknown vorrebbe dire che blah punti per un IUnknown, che violerebbe il tipo di sicurezza.

nobugz soluzione probabilmente è quello che vuoi fare, anche se direi che l'impostazione di tali puntatori a NULL non aumenta la qualità del codice.Se è necessario per garantire che il codice non Release più volte, probabilmente si dovrebbe andare a correggere il codice, piuttosto che prendere buggy codice non fallire.

Non ho lavorato con DirectX in un po', ma mi ricordo che ha un SAFE_RELEASE macro da qualche parte nel suo header.Codice di Google di ricerca di spettacoli in dxutil.h.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top