2012-08-25 51 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

我不知道,为什么大拇指朝下,这是建设性的定义。 –