No se llama cuando push_back
, se llama cuando el temporal se destruye.
solucionarlo en su ejemplo:
TEST test;
for (int i = 0; i < 5; ++i)
{
m_test.push_back(test);
}
sólo debe llamar una vez.
Su código está creando un TEST
temporal dentro del ciclo, usándolo en push_back
, y luego ese temporal se sale del alcance cuando el ciclo termina/repite y se destruye. Eso ocurre exactamente como debería, ya que el TEST
temporal necesita limpiarse.
Si desea evitar eso, debe hacer cualquier otra cosa que no sea crear un objeto temporal para cada inserción. Una posible solución es:
vector<TEST> m_test(5); // Note reserving space in the vector for 5 objects
std::fill(m_test.begin(), m_test.end(), TEST()); // Fill the vector with the default ctor
Dependiendo de como se optimiza la STL, esto puede no necesitar hacer varias copias.
También puede ser capaz de obtener un mejor manejo si se implementa un constructor de copia en su clase TEST
, como:
TEST::TEST(const TEST & other)
{
x = new int(*other.x); // Not entirely safe, but the simplest copy ctor for this example.
}
si esto es apropiado, o cómo manejar la situación, depende de su clase y su necesita, pero normalmente debe tener un constructor de copia cuando haya definido su propio constructor y destructor (de lo contrario, el compilador generará uno, y en este caso, dará como resultado punteros copiados y colgantes al x
).
En C++ 11, puede usar 'm_test.emplace_back()' para evitar crear el temporal. En cualquier caso, siempre recuerde la [Regla de Tres] (http://stackoverflow.com/questions/4172722). –