Supposons que j'ai défini une classe comme celle-ci:
class foo {
private:
std::vector< int* > v;
public:
...
void bar1()
{
for (int i = 0; i < 10; i++) {
int *a = new int;
v.Push_back( a );
}
};
void bar2()
{
std::vector< int >::iterator it = v.begin();
for ( ; it != v.end(); it++ )
std::cout << (*it);
v.clear();
}
};
En bref, je repousse quelques pointeurs dans un vecteur, plus tard, j'efface le vecteur. La question est, ce code a-t-il une fuite de mémoire? Je veux dire en effaçant le vecteur, les pointeurs sont-ils supprimés correctement?
Oui, le code présente une fuite de mémoire, sauf si vous supprimez les pointeurs. Si la classe foo
possède les pointeurs, il est de sa responsabilité de les supprimer. Vous devez le faire avant d'effacer le vecteur, sinon vous perdez la poignée de la mémoire que vous devez désallouer.
for (auto p : v)
{
delete p;
}
v.clear();
Vous pouvez éviter complètement le problème de gestion de la mémoire en utilisant un std::vector
d'un pointeur intelligent approprié .
Je pense que la solution la plus courte et la plus claire serait:
std::vector<Object*> container = ... ;
for (Object* obj : container)
delete obj;
container.clear();
Non, vous effacez uniquement le stockage vectoriel. La mémoire allouée avec "nouveau" est toujours là.
for (int i =0; i< v.size();i++)
{
delete (v[i]);
}
v.clear();
Vous pouvez utiliser for_each
:
std::vector<int*> v;
template<typename T>
struct deleter : std::unary_function<const T*, void>
{
void operator() (const T *ptr) const
{
delete ptr;
}
};
// call deleter for each element , freeing them
std::for_each (v.begin (), v.end (), deleter<int> ());
v.clear ();