析构函数和映射

时间:2012-08-25 21:18:48

标签: c++ destructor

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呢?

3 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

相同的:

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

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

也无需在析构函数中调用v.clear();