Doug T. ответили на ваш вопрос приятно. Я расскажу вам об intrusive_ptr. Может быть, вы тоже можете использовать его в своем проекте.
Если у вас есть библиотека C, в которой уже есть счетчик ссылок, но вам нужно вручную вызывать эти функции, вы также можете использовать boost::intrusive_ptr
и предоставить правильные определения для ее функций add_ref и release. intrusive_ptr найдет и вызовет их. Они несут ответственность за увеличение счетчика ссылок и уменьшение его, освобождая ресурс при необходимости:
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);
}
Тогда вы можете просто создавать объекты из необработанных указателей типа foo*
. intrusive_ptr будет вызывать ваши функции при копировании / уничтожении:
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);