Claudio Brotto

COM, AddRef, Release e non fidarsi mai

Leggevo (appena sveglio ... fate voi) questo interessante post che mette a confronto l'utilizzo di CComPtr<> e CComQIPtr<>.

Chi ha lavorato un po' con COM (e non è stato bandito per aver utilizzato gli smart pointers) credo se li ricordi.

Per chi non ha avuto occasione, in breve sono due classi che mascherano al client le semantiche di rilascio degli oggetti (cosa che in COM è esplicita, AddRef e Release sono due metodi di interfaccia esposti da *ogni* oggetto COM, per definizione, e che devono essere richiamati per garantire il corretto life-time dell'oggetto stesso). Il distruttore richiama il metodo Release rendendo, almeno in parte, il meccanismo di gestione della memoria automatico, in quanto il reference counter viene decrementato all'uscita di scope.

Fin qui la mia giornata era normale.

Seguendo un po' di link, però, vado a finire qui e scopro una cosa che realmente non sapevo e che, ripensando ad alcuni pezzi di codice che ho visto (e scritto) in passato mi fa un po ... diciamo pensare, ecco.

Mi riferisco a questa frase delle specifiche di COM (l'articolo è un overview, badate che è del 1995 !).

The return values of AddRef and Release should not be relied upon, and should be used only for debugging purposes.

In altre parole: non è detto che AddRef e Release ritornino il valore corrente del reference counter dell'interfaccia sulla quale sono richiamati. Cosa che invece davo per assodata, e sulla quale temo anche di aver basato qualche logica in qualche applicazione di qualche anno fa.

Mmmhhh ... chissa se qugli strani bug classificati come "ignoti" ...

Posted: apr 11 2007, 07.31 by devlizard | with no comments
Filed under: