usar una iniciar heredar ejemplos derivadas crear como clases clase amistad c++ g++ memory-management stlport

c++ - una - Cómo usar std:: allocator en mi propia clase contenedora



como usar una clase en c++ (2)

Estoy tratando de escribir una clase contenedora que utiliza asignadores STL. Lo que actualmente hago es tener un miembro privado.

std::allocator<T> alloc_;

(esto será luego una plantilla para que el usuario pueda elegir un asignador diferente) y luego llamar

T* ptr = alloc_.allocate(1,0);

para obtener un puntero a un objeto ''T'' recién asignado (y se utiliza alloc_.construct para llamar al constructor; consulte la respuesta a continuación). Esto funciona con la biblioteca GNU C ++.

Sin embargo, con STLPort en Solaris, esto no hace lo correcto y conduce a todo tipo de errores de corrupción de memoria extraños. Si en cambio yo hago

std::allocator_interface<std::allocator<T> > alloc_;

entonces todo está funcionando como debería.

¿Cuál es la forma correcta de usar el stl :: allocator? La versión de STLPort / Solaris no se compila con g ++, pero ¿es g ++ correcto?


Algo que quizás quieras hacer es tener tu propio allocator personalizado que puedes usar para ver cómo los contenedores estándar interactúan con los asignadores. Stephan T. Lavavej publicó un bonito y sencillo llamado mallocator . Colóquelo en un programa de prueba que use varios contenedores STL y podrá ver fácilmente cómo los contenedores estándar utilizan el asignador:

No todas las funciones de la interfaz en el mallocator (como construct() y destroy() ) están equipadas con resultados de seguimiento, por lo que es posible que desee colocar declaraciones de seguimiento allí para ver más fácilmente cómo los contenedores estándar podrían usar esas funciones sin tener que recurrir. a un depurador.

Eso debería darle una buena idea de cómo se espera que sus contenedores utilicen un allocator personalizado.


Es necesario asignar y construir con el asignador. Algo como esto:

T* ptr = alloc_.allocate(1,0); alloc_.construct(ptr, value);

Muchas cosas están totalmente rotas si no empiezas con un objeto construido adecuadamente. Imagina una std::string asignada pero no construida. Cuando intente asignárselo, primero intentará limpiar sus contenidos antiguos liberando algunos datos, que por supuesto serán valores de basura del montón y la falla.