2012-10-09 159 views
17

假设我已经定义的类是这样的:清除指针的矢量

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

总之,我推回了一些三分球矢量,后来我清除载体。问题是,这段代码是否有内存泄漏?我的意思是通过清除矢量,指针是否正确删除?

+2

你居然推只有一个指针向量; 'bar1'中的'for'循环只执行'new int;'行,因为它没有大括号,'i +++'是一个语法错误,并且......好吧,我猜这是伪代码。 –

+0

@ Frerich Raabe:编辑... – mahmood

+0

您还需要一个int指针向量:'std :: vector < int* > v;'而不是'std :: vector < int > v;' – juanchopanza

回答

24

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

for (std::vector<int>::iterator it = v.begin() ; it != v.end(); ++it) 
    { 
    delete (*it); 
    } 
    v.clear(); 

你可以通过使用合适的smart pointer一个std::vector完全避免内存管理问题。

+0

你可以请给我straghit方法(不是智能ptr)? – mahmood

+0

@mahmood它取决于你的课程的细节,但是你可以确信你应该在清除向量之前完成它。迭代它,删除每个元素。 *然后*清除它。 – juanchopanza

+0

@mahmood我加了一个例子。 – juanchopanza

6

不,你只清除矢量存储。用“新”分配内存仍然存在。

for (int i =0; i< v.size();i++) 
    { 
    delete (v[i]); 
    } 
    v.clear(); 
+0

那么我该如何删除? – mahmood

+1

每次迭代使用'删除'。比使用清除后清除载体。 e,g删除(* it) – 2012-10-09 07:52:56

+0

for(auto&i:v) { delete(i); } v.clear();这段代码是否正确 – lsrawat

2

您可以使用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(); 
+0

我经常希望这样的'deleter'很容易得到;我想知道,你能用'std :: mem_fun_ptr或'std:fun_ptr'来实现吗? –

6

我觉得最短和最清晰的解决方案是:

std::vector<Object*> container = ... ; 
for (Object* obj : container) 
    delete obj; 
container.clear();