vectores programacion matrices lenguaje imprimir elementos ejemplos declarar crear como c++ stl vector stdvector

c++ - programacion - ¿Por qué un vector vacío llama al constructor predeterminado del tipo de valor?



vectores c++ (2)

Usando g ++, observo que crear un vector de tamaño cero llama una vez al constructor del tipo de objeto parametrizado del vector. Luego se borra. ¿Por qué pasó esto?

#include <iostream> #include <vector> using namespace std; class s { public: s() { cout << endl << "default s constructor" << endl; } ~s() { cout << endl << "default s destructor" << endl; } }; int main() { vector<s> v(0); }

Salida:

constructor predeterminado

destructor predeterminado


El constructor real al que está llamando es (desde cplusplus.com):

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

Por lo tanto, aunque solo especifique el tamaño, se creará un nuevo objeto T para el segundo parámetro y, por lo tanto, también se destruirá a la conclusión del constructor.


Porque está pasando explícitamente un tamaño inicial, que llama a un constructor que tiene otro parámetro cuyo valor predeterminado es s() . Simplemente omita el (0) (es decir, std::vector<s> v; ) y no sucederá.

Para completar, el Estándar 23.2.4-2 define el constructor al que llama como:

explicit vector(size_type n, const T& value = T() ,
const Allocator& = Allocator());

A un lado (relevante para C ++ 03 pero no para C ++ 11)

Otro aspecto de comportamiento interesante de este constructor también levanta su cabeza en SO periódicamente: cuando el número inicial de elementos solicitados es> 0, copia-construye esos elementos del parámetro prototypal al constructor:

  • las personas a menudo ponen un constructor predeterminado que deja las variables miembro sin inicializar, esperando hacer el vector(n) casi tan rápido como la asignación de almacenamiento libre subyacente, PERO
  • el copy-constructor todavía se llama n veces para copiar el contenido "basura" del objeto prototypal en cada uno de los elementos solicitados

Esto tiene un costo obvio de rendimiento, pero también puede bloquear la aplicación si el contenido de basura incluye, por ejemplo, punteros que el constructor de copias solo puede suponer que son válidos. Del mismo modo, es extremadamente peligroso incluso push_back un objeto de basura no inicializado: carece de encapsulado semántico de valor adecuado y puede copiarse a medida que el vector cambia de tamaño, las operaciones algorítmicas como std::sort() se realizan en el vector, etc.