2012-10-09 211 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();