2009-12-08 20 views
5

¿Hay implementaciones de STL que usan operator new[] como asignador? En mi compilador, hacer Foo::operator new[] en privado no me impidió crear un vector<Foo> ... ¿ese comportamiento está garantizado por algo?Asignadores de STL y operador nuevo []

Respuesta

4

C++ Estándar, sección 20.4.1.1. El asignador asigna por defecto() función utiliza operador global nueva: implementaciones de biblioteca

pointer allocate(size_type n, allocator<void>::const_pointerhint=0); 

3 Notes: Uses ::operator new(size_t) (18.4.1). 
+0

No se puede encontrar dicha declaración en C++ Standard. ¿Qué revisión usas? –

+0

ISO/IEC 14882: 1998 (E) –

+1

Es 20.4.1.1, no 24.4.1.1, lo que podría explicar por qué Kirill no lo encontró. –

2

std no utilizarán T :: operador new [] para std :: asignador. La mayoría de ellos usa su propia infraestructura de agrupación de memoria detrás de escena.

En general, si desea detener la asignación dinámica de objetos Foo, deberá hacer que todos los constructores sean privados y proporcionar una función que cree objetos Foo. Por supuesto, tampoco podrá crearlos como variables auto.

+2

Un vector básicamente asigna memoria no inicializada y coloca objetos allí más tarde a medida que se agregan. Reservar memoria no crea instancias. – UncleBens

2

std :: vector usa un Allocator que se pasa como un argumento de plantilla, que por defecto es std :: allocate. Sin embargo, el asignador no funciona como new[]; solo asigna la memoria bruta, y la ubicación new se usa para crear realmente los objetos en esa memoria cuando le dices que agregue los objetos (por ejemplo, con push_back() o resize()).

La única manera en que podría usar new[] en un asignador sería si abusaba un poco de las cosas y le asignaba espacio sin procesar usando algo como new char[size];. A medida que los abusos van, ese es bastante inofensivo, pero aún no está relacionado con su sobrecarga de new[] para la clase.

0

Si desea prohibir la creación de su objeto, haga el constructor privado en lugar de operator new.

0

Además de las otras respuestas aquí, si desea evitar que alguien cree un contenedor STL para su tipo Foo, simplemente haga que el constructor de copias para Foo sea privado (también el movimiento-constructor si está trabajando con C++ 11). Todos los objetos del contenedor STL deben tener un constructor de copia o movimiento válido para el asignador del contenedor para llamar correctamente al emplazamiento new y construir una copia del objeto en el bloque de memoria asignado para el contenedor.

Cuestiones relacionadas