Quiero que los objetos administrados por un shared_ptr se asignen desde un grupo, por ejemplo, la interfaz Pool de Boost, ¿cómo se puede lograr esto?Asignador personalizado (pool) con impulso shared_ptr
Respuesta
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
).
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
Como yo lo entiendo, shared_ptr se puede definir para tomar un asignador de costumbre: 'plantilla
El asignador es para el objeto contador – philsquared
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.
¿No podría usar 'boost :: allocate_shared' con' boost :: pool_alloc'? – dvide
- 1. impulso shared_ptr
- 2. impulso shared_ptr y 'esto'
- 3. impulso :: shared_ptr contenedor estándar
- 4. impulso serializar y std :: shared_ptr
- 5. Use un asignador personalizado con boost :: bimap
- 6. n-op para el impulso :: shared_ptr
- 7. Cómo eliminar intencionalmente un impulso :: shared_ptr?
- 8. Asignador personalizado y miembro predeterminado
- 9. Obteniendo un impulso :: shared_ptr para este
- 10. Asignador personalizado en std :: vector
- 11. Uso del eliminador personalizado con std :: shared_ptr
- 12. Usando .reset() para liberar un impulso :: shared_ptr con propiedad única
- 13. Establecer un asignador personalizado para cadenas
- 14. Callling object constructor/destructor con un asignador personalizado
- 15. impulso :: ptr_container y std :: vector <shared_ptr>
- 16. Efficient C pool allocator?
- 17. Uso apropiado de shared_ptr?
- 18. Pool Billiard AI
- 19. Cómo usar la biblioteca de impulso (incluyendo shared_ptr) con Android NDK y STLport
- 20. asignador/administrador de memoria personalizado en C? cual enfoque?
- 21. shared_ptr con plantillas
- 22. static_cast con boost :: shared_ptr?
- 23. Haciendo una HANDLE RAII compatible con shared_ptr con un eliminador personalizado
- 24. Hilos impulso con CLR
- 25. ¿qué significa asignador de STL
- 26. Puntero NULL con boost :: shared_ptr?
- 27. Con respecto a Java String Constant Pool
- 28. valor por defecto para el impulso :: shared_ptr el constructor de la clase
- 29. std :: map rendimiento del asignador estándar versus asignador de bloque
- 30. ¿Es posible pasar un impulso shared_ptr de C++ a Python y volver a C++
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
¿Sabes si hay una razón técnica para que 'construct' no tome ningún argumento? – inf
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