nestle libreria library drink descargar bebida c++ boost

c++ - libreria - descargar boost



hacer que shared_ptr no use delete (4)

en mi código, me gustaría que boost :: shared_ptr no llame a delete pero llame a ptr-> deleteMe () en su lugar.

También tengo algunas funciones de estilo C que devuelven un ptr. ¿Puedo hacer que se llame lib_freeXYZ (ptr); en lugar de tratar de eliminar?


O qué tal si usamos stl para proporcionar el functor contenedora - descripción de Doug T. pero sin la persona que llama personalizada.

boost::shared_ptr<T> ptr( new T, std::mem_fun_ref(&T::deleteMe) ); boost::shared_ptr<S> ptr( new S, std::ptr_fun(lib_freeXYZ) );


Para los datos de estilo C, hazlo como @Doug. T sugirió.

Para su clase, ¿por qué no hacer la limpieza en un destructor? Incluso si esto incluye deleteMe () en el destructor.


Puede darle a la plantilla shared_ptr una función de eliminación personalizada que tiene la firma

void Deleter( T* ptr);

para un impulso :: shared_ptr

Entonces, para Deleter harías

boost::shared_ptr<T> ptrToT( new T, Deleter );

luego en el cuerpo de Deleter:

void Deleter( T* ptr); { ptr->deleteMe(); // And make sure YOU ACTUALLY DELETE (or do whatever else you need to // do to release the resource) delete ptr; }

Para su caso específico cuando necesita algo simple (como ptr-> deleteMe) vea la solución de Greg, es muy agradable.


Doug T. respondió a tu pregunta muy bien. Te contaré sobre intrusive_ptr. Quizás también puedas usarlo en tu proyecto.

Si tiene alguna biblioteca en C que ya tiene recuento de referencias, pero tiene que llamar manualmente esas funciones, también puede usar boost::intrusive_ptr y proporcionar las definiciones adecuadas para sus funciones add_ref y release. intrusive_ptr los encontrará y los llamará. Ellos son responsables de incrementar el conteo de referencia y disminuirlo, liberando el recurso cuando sea necesario:

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); }

Entonces puedes simplemente crear objetos a partir de punteros crudos de tipo foo* . intrusive_ptr llamará a sus funciones cuando se copie / destruya:

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);