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
呢?
答案 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();
。