51

假设我已经定义了一个这样的类:

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

简而言之,我推回向量中的一些指针,然后清除向量。问题是,这段代码有内存泄漏吗?我的意思是通过清除向量,是否正确删除了指针?

4

4 回答 4

66

是的,除非您删除指针,否则代码存在内存泄漏。如果foo类拥有指针,则删除它们是它的责任。您应该在清除向量之前执行此操作,否则您会丢失需要取消分配的内存的句柄。

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

std::vector您可以通过使用合适的智能指针来完全避免内存管理问题。

于 2012-10-09T07:48:05.410 回答
15

我认为最短和最清晰的解决方案是:

std::vector<Object*> container = ... ;
for (Object* obj : container)
    delete obj;
container.clear();
于 2015-10-01T16:06:04.717 回答
9

不,您只清除矢量存储。带有“新”的分配内存仍然存在。

for (int i =0; i< v.size();i++)
   {
     delete (v[i]);
   } 
   v.clear();
于 2012-10-09T07:48:36.033 回答
5

您可以使用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 ();
于 2012-10-09T07:52:54.377 回答