he hecho la siguiente pequeño programa: (básicamente una clase que COUTS si se crea, copiado o destruida y una principal que hace un poco de ese)std C++ destrucción elemento contenedor y el comportamiento de inserción
class Foo
{
public:
Foo(string name): _name(name)
{
cout << "Instance " << _name << " of Foo created!" << std::endl;
};
Foo(const Foo& other): _name(other._name)
{
cout << "Instance " << _name << " of Foo copied!" << std::endl;
};
~Foo()
{
cout << "Instance " << _name << " of Foo destroyed!" << std::endl;
}
string _name;
};
int main(int argc, char**argv)
{
Foo albert("Albert");
Foo bert("Bert");
{
vector<Foo> v1, v2;
system("PAUSE");
v1.push_back(albert);
system("PAUSE");
v2.push_back(bert);
system("PAUSE");
v1 = v2;
system("PAUSE");
}
system("PAUSE");
}
El resultado es el siguiente:
Instance Albert of class Foo created!
Instance Bert of class Foo created!
Press any key...
Instance Albert of class Foo copied!
Instance Albert of class Foo copied! // why another copy?
Instance Albert of class Foo destroyed! // and destruction?
Press any key...
Instance Bert of class Foo copied!
Instance Bert of class Foo copied!
Instance Bert of class Foo destroyed!
Press any key... // v1=v2 why did the albert instance not get destroyed?
Press any key...
Instance Bert of class A destroyed!
Instance Bert of class A destroyed!
Press any key... // there's still an albert living in the void
Esto me parece muy extraño. ¿Por qué me molesto en pasar algo como referencia si se copia dos veces de todos modos? ¿Por qué el v1.operator = (otro) no destruye los elementos que contiene? Encajaría muy bien con el comportamiento de shared_ptr. ¿Puede alguien decirme por qué?
ADEMÁS Pongo esto en un bucle sin fin y comprobado el uso de mem, no parece producir una fuga mem al menos.
ADICION Ok, la memoria no es un problema porque utiliza operator = en lugar del copy ctor, ok gracias. Cuando agrego
v1.reserve(10);
v2.reserve(10);
el número lógico de los ejemplares se realice. sin eso, reasigna y copia el vector completo para cada push_back, (que encuentro bastante retardado incluso para vectores pequeños). En cuanto a esto voy a considerar el uso de .reserve más y optimizar mis operadores de asignación igual que el infierno :)
ADEMÁS: RESUMEN
- Todas estas cuestiones parecen específico para VC++ 2005.
- Si el tamaño de los dos contenedores coincide, mi implementación utiliza operator = en los elementos en lugar de destruir los antiguos y copiar los nuevos, lo que parece práctica de sonido. SI los tamaños son diferentes, se usan destrucción y copia normal.
- Con la implementación de 2005, ¡uno tiene que usar la reserva! De lo contrario, un rendimiento abismal y no estándar.
- Estas cajas negras son mucho más negras de lo que pensaba.
¿Has intentado compilar esto como una versión de lanzamiento? – jalf
Sí. Mismo resultado. – AndreasT
Es fácil probarse a sí mismo, solo copie y pegue en un proyecto vacío y, agregue incluye iostream, vector y cadena, y listo. – AndreasT