web-dev-qa-db-fra.com

effacement d'un vecteur de pointeurs

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?

28
mahmood

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é .

36
juanchopanza

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();
10
Tim Kuipers

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();
7
user349026

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 ();
3
tozka