Parce que vous êtes (un) chance. auto_ptr
appelle delete
, et non delete []
. C'est un comportement indéfini.
Essayez de faire quelque chose comme ça et voir si vous obtenez aussi chanceux:
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]);
}
L'idée ici est que votre destructor pour Foo
ne sera pas appelé.
La raison est quelque chose comme ceci: Quand vous dites delete[] p
, la mise en œuvre de delete[]
est supposé aller à chaque élément du tableau, appelez son destructor, puis libérer la mémoire pointée par p. De même, delete p
est supposé appeler le destructeur sur p, puis libérer la mémoire.
char
's n'ont pas de destructeur, donc il va juste supprimer la mémoire pointée par p. Dans mon code ci-dessus, il est pas va détruire chaque élément dans le tableau (parce qu'il n'appelle pas delete[]
), donc certains Foo laissera leur variable de barre locale non supprimée.
Dans la plupart des cas, si vous associez new avec delete [] et vice versa pour des types non triviaux, cela ne provoque pas de fuite - le programme se bloque simplement lorsque vous essayez de libérer de la mémoire. – sharptooth
Vous pouvez essayer d'utiliser boost :: scoped_array au lieu de std :: auto_ptr –