2012-08-25 95 views
1
class X; 

class Y { 
    public: 
     ~Y(); 
    private: 
     map<int,X*> m; 
     vector<X*> v; 
     X* px; 
}; 

我猜class Y的析構函數應該看起來像這樣?破壞者和地圖

Y::~Y() { 
    delete px; 
    for (vector<X*>::iterator it = v.begin(); it!=v.end(); it++) 
    delete *it; 
    v.clear(); 
} 

但是Y::m呢?

回答

4

至於載體,但在地圖...

for (map<int, X*>::iterator it = m.begin(); it != m.end(); ++it) 
    delete it->second; 
+0

@OP:注意預增量。如你在這裏看到的那樣,使用迭代器的preincrement更好 – xQuare

+0

哦,我......我甚至都沒有想過地圖有迭代器。對不起,打擾了。謝謝。 – scarably

0

一樣:

for (map<int,X*>::iterator it = m.begin() ; it != m.end() ; it++) 
    delete it->second; 

在C++ 11可以使用auto跳過迭代器類型。

也沒有必要在析構函數中調用v.clear();

17

不,這是完全錯誤的。您已手動刪除資源,而不是使用資源管理類。這是一個非常糟糕的錯誤。如果您有責任釋放它們,您確實需要unique_ptr<X>shared_ptr<X>或某些類似的類別,而不是。

class Y { 
    private: 
     map<int,std::unique_ptr<X>> m; 
     vector<std::unique_ptr<X>> v; 
     std::unique_ptr<X> px; 
}; 

現在不需要自定義析構函數。

+0

這個答案需要更多upvotes。 – 2012-08-25 21:30:02

+0

我沒有downvote你,但稱它是完全錯誤的是錯誤的,雖然你的建議是好的+1 :) –

+0

我不知道,爲什麼大拇指朝下,這是建設性的定義。 –