c++ boost shared-ptr allocator

c++ - Asignador personalizado(pool) con boost shared_ptr



shared-ptr allocator (3)

Quiero que los objetos administrados por un shared_ptr se asignen desde un grupo, por ejemplo, la interfaz del Pool de Boost, ¿cómo se puede lograr esto?


Aquí está el código para hacer lo que quiera (probablemente no se compilará porque no tengo el impulso a mano y lo estoy escribiendo desde la memoria):

class YourClass; // your data type, defined somewhere else boost::object_pool<YourClass> allocator; void destroy(YourClass* pointer) { allocator.destroy(pointer); } boost::shared_ptr<YourClass> create() { // usage of object_pool<??>::construct requires that you have a // YourClass::YourClass(void) defined. If you need to pass arguments // to the new instance, you need to do that separately. // // for example using a YourClass::Initialize(your,parameters,here) method // before returning from this function return boost::shared_ptr<YourClass>( allocator.construct(), &destroy ); } // usage: boost::shared_ptr<YourClass> newObject = create();

Implementé esto dos veces, en dos proyectos diferentes. En ambos, las funciones de crear y destruir estaban sincronizadas (puede agregar un bloqueo de boost::mutex bloqueo de boost::mutex alrededor del uso del asignador) y eran miembros de una clase de fábrica (y la firma del destroy se modificó para void (YourClass*) mediante el uso de boost::bind ).

También puede evitar escribir dos funciones adicionales ( destroy y create ) vinculando object_pool<YourClass>::destroy dirrectly en el constructor boost :: shared_ptr.

Soy demasiado vago para escribir todo eso ahora :).

Editar (moví mi comentario de respuesta aquí para el formato del código):

Para enlazar la función de destrucción:

class ClassFactory { boost::object_pool<YourClass> allocator; public: boost::shared_ptr<YourClass> create() { return boost::shared_ptr<YourClass>( allocator.construct(), boost::bind(&ClassFactory::destroy, this, _1) ); } void destroy(YourClass* pointer) { allocator.destroy(pointer); } };

ClassFactory debe tener una vida útil más larga que shared_ptr (si se ClassFactory instancia de ClassFactory , este puntero pasado a la instancia de shared_ptr no será válido y bloqueará su aplicación cuando shared_ptr elimine la instancia de YourClass ).


Estas son preocupaciones casi ortogonales. shared_ptr no juega ningún papel en la asignación de objetos.

Donde se trata es en la eliminación de la memoria que ya no se hace referencia. Si ha asignado algo diferente al montón predeterminado, deberá proporcionar un eliminador personalizado.


Solución evidente:

Crea tu propia función make_shared e impone el uso de este método a shared_ptr creado. Aquellos que se derivan de La Regla serán castigados.

Nota:

Parece haber una confusión con el rol de shared_ptr . Su función es gestionar la memoria de lo que TÚ ha asignado, sin embargo para hacerlo requiere una asignación propia (contador y eliminador), por lo tanto, puedes pasarle un asignador para eso.