2
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

3 回答 3

21

不,那是完全错误的。您手动删除了资源,而不是使用资源管理类。这是一个非常糟糕的错误。如果你负责释放它们,你真的想要unique_ptr<X>orshared_ptr<X>或一些类似的类,而不是。X*

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

现在不需要自定义析构函数。

于 2012-08-25T21:26:27.850 回答
6

至于矢量,但对于地图...

for (map<int, X*>::iterator it = m.begin(); it != m.end(); ++it)
   delete it->second;
于 2012-08-25T21:20:56.760 回答
1

相同的:

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

在 C++11 中,您可以使用auto跳过迭代器类型。

也不需要调用v.clear();析构函数。

于 2012-08-25T21:21:20.307 回答