2010-05-26 17 views

Respuesta

21

Aquí está el código para hacer lo que quiere (probablemente no se compilará como no tengo impulso en la mano y lo estoy escribiendo de 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(); 

He implementado esto dos veces, en dos proyectos diferentes En ambas, las funciones crear y destruir estaban sincronizadas (puede agregar un bloqueo boost::mutex en el uso del asignador) y eran miembros de una clase de fábrica (y la firma destroy se modificó a 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 perezoso para escribir todo eso ahora :).

Editar (se ha llevado mi comentario respuesta en aquí para el formato de código):

Para obligar a la función de destruir:

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 la shared_ptr (si el ClassFactory la instancia se elimina, el puntero pasado a la instancia shared_ptr no será válido y bloqueará la aplicación cuando shared_ptr elimine la instancia YourClass).

+0

Gracias, esto es lo que estaba buscando. Me interesaría ver cómo se hace usando una clase de fábrica. Tengo problemas para vincular la función de destrucción. – myahya

+0

¿Sabes si hay una razón técnica para que 'construct' no tome ningún argumento? – inf

+0

Hace poco hice algo muy similar con una clase de grupo con plantillas y escribí sobre esto aquí: https://www.burgundywall.com/post/shared_pool – Kurt

1

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

Cuando es de que se trate está en la eliminación de memoria ya no se hace referencia. Si ha asignado desde que no sea el montón predeterminado todo lo que necesita para provide a custom deleter

+0

Como yo lo entiendo, shared_ptr se puede definir para tomar un asignador de costumbre: 'plantilla shared_ptr (Y * P, D d, A a);' La pregunta es, lo que vale para D si tuviera que usar Boost's pool_alloc – myahya

+0

El asignador es para el objeto contador – philsquared

4

solución evidente:

Cree su propia función make_shared y hacer cumplir el uso de este método para shared_ptr creado. Aquellos que se derivan de La Regla serán castigados.

Nota:

No parece haber una confusión con el papel de la 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.

+2

¿No podría usar 'boost :: allocate_shared' con' boost :: pool_alloc'? – dvide

Cuestiones relacionadas