clearing a vector of pointers [duplicate]

2020-02-08 03:33发布

Assume I have defined a class like this:

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

In short, I push back some pointers in a vector, later I clear the vector. The question is, does this code has memory leak? I mean by clearing the vector, are the pointers deleted properly?

4条回答
走好不送
2楼-- · 2020-02-08 04:11

I think the shortest and clearest solution would be:

std::vector<Object*> container = ... ;
for (Object* obj : container)
    delete obj;
container.clear();
查看更多
姐就是有狂的资本
3楼-- · 2020-02-08 04:17

Yes, the code has a memory leak unless you delete the pointers. If the foo class owns the pointers, it is its responsibility to delete them. You should do this before clearing the vector, otherwise you lose the handle to the memory you need to de-allocate.

   for (auto p : v)
   {
     delete p;
   } 
   v.clear();

You could avoid the memory management issue altogether by using a std::vector of a suitable smart pointer.

查看更多
Bombasti
4楼-- · 2020-02-08 04:28

You can use 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 ();
查看更多
兄弟一词,经得起流年.
5楼-- · 2020-02-08 04:29

Nope you only clear the vector storage. Allocated memory with 'new' is still there.

for (int i =0; i< v.size();i++)
   {
     delete (v[i]);
   } 
   v.clear();
查看更多
登录 后发表回答