¿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
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).
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
.
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
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.
Si desea prohibir la creación de su objeto, haga el constructor privado en lugar de operator new
.
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.
- 1. C++ Pregunta STL: asignadores
- 2. C++ Asignadores conforme a STL
- 3. compatibilidad del compilador para asignadores con estado en contenedores STL
- 4. Asignadores personalizados STL para administrar diferentes espacios de memoria
- 5. ¿Los asignadores personalizados en STL solo asignan los datos reales?
- 6. Operador STL less y error "operador no válido <
- 7. Contenedor STL: Parámetro del asignador de constructor y asignadores de ámbito
- 8. Operador de mezcla nuevo [] y colocación nuevo con eliminación normal []
- 9. nuevo o nuevo código de operador []
- 10. ¿Cómo podría sobrecargar sensiblemente el operador de colocación nuevo?
- 11. C++ STL asignador vs operador nueva
- 12. C++: Asignadores de memoria
- 13. ¿Cuándo sobrecarga el operador nuevo?
- 14. Cómo burlarse del operador 'nuevo'
- 15. ¿El nuevo operador devolverá NULL?
- 16. Referencia indefinida al nuevo operador
- 17. ¿Es necesario sobrecargar el nuevo operador de colocación, cuando sobrecargamos un nuevo operador?
- 18. Nuevo operador de C++ - diseño de memoria
- 19. operador nuevo espacio de nombres dentro
- 20. Entity Framework 4 Código Primero y el nuevo() Operador
- 21. ¿Cuál es la diferencia entre el nuevo operador y Class.newInstance()?
- 22. Inicializar un objeto con y sin nuevo operador
- 23. Uso de múltiples asignadores de manera eficiente
- 24. ¿Cómo funciona STL map :: find sin el operador de igualdad?
- 25. C++ UNICODE y STL
- 26. C++ seguridad de hilo de operador nuevo en linux y gcc 4
- 27. Sobrecarga global operador nuevo/eliminar en C++
- 28. Referencia no definida al operador nuevo
- 29. Operador sobrecarga nuevo para una clase
- 30. Uso nuevo operador para inicializar una matriz
No se puede encontrar dicha declaración en C++ Standard. ¿Qué revisión usas? –
ISO/IEC 14882: 1998 (E) –
Es 20.4.1.1, no 24.4.1.1, lo que podría explicar por qué Kirill no lo encontró. –