Doug T. a bien répondu à votre question. Je vais vous parler de intrusive_ptr. Peut-être que vous pouvez l'utiliser dans votre projet aussi.
Si vous avez une bibliothèque C qui a déjà un comptage de référence, mais que vous devez appeler manuellement ces fonctions, vous pouvez utiliser boost::intrusive_ptr
aussi, et fournir des définitions appropriées pour ses fonctions add_ref et release. intrusive_ptr les trouvera et les appellera. Elles sont responsables d'incrémenter le nombre de références et de le décrémenter, en libérant la ressource si nécessaire :
void intrusive_ptr_add_ref(foo *f) {
lib_add_ref(f);
}
void intrusive_ptr_release(foo *f) {
if(lib_dec_ref(f) == 0)
lib_free(f);
}
Ensuite, vous pouvez simplement créer des objets à partir de pointeurs bruts de type foo*
. intrusif_ptr appellera vos fonctions quand il sera copié/détruit :
intrusive_ptr<foo> f(lib_alloc());
// can wrap raw pointers too, which already may be referenced somewhere else
foo *p = get_foo_from_somewhere();
function_taking_intrusive_ptr(p);