Porque eres (des) afortunado. auto_ptr
llamadas delete
, no delete []
. Este es un comportamiento indefinido.
trate de hacer algo como esto y ver si le da la misma suerte:
struct Foo
{
char *bar;
Foo(void) : bar(new char[100]) { }
~Foo(void) { delete [] bar; }
}
int iterCount = 1000;
int sizeBig = 100000;
for (int i = 0; i < iterCount; i++)
{
std::auto_ptr<Foo> buffer(new Foo[sizeBig]);
}
La idea aquí es que su destructor para Foo
no será llamado.
La razón es algo como esto: Cuando dice delete[] p
, la implementación de delete[]
se supone que debe ir a cada elemento de la matriz, llame a su destructor, a continuación, liberar la memoria a la que apunta p. De manera similar, se supone que delete p
llama al destructor en p, luego libera la memoria.
char
's no tienen un destructor, por lo que solo va a eliminar la memoria apuntada por p. En mi código anterior, es no va a destruir cada elemento en la matriz (porque no está llamando al delete[]
), por lo que algunos Foo dejarán su barra de variables locales sin eliminar.
En la mayoría de los casos, si empareja nuevo con delete [] y viceversa para tipos no triviales, esto no provoca una fuga, en su lugar, el programa simplemente se bloquea al intentar desasignar la memoria. – sharptooth
Puede intentar usar boost :: scoped_array en lugar de std :: auto_ptr –