C++ 析构函数与映射
但是关于C++ 析构函数与映射,c++,destructor,C++,Destructor,但是关于Y::m呢 对于向量,但是对于映射 Y::~Y() { delete px; for (vector<X*>::iterator it = v.begin(); it!=v.end(); it++) delete *it; v.clear(); } for(map::iterator it=m.begin();it!=m.end();++it) 删除它->秒; 相同: for (map<int, X*>::iterator i
Y::m
呢 对于向量,但是对于映射
Y::~Y() {
delete px;
for (vector<X*>::iterator it = v.begin(); it!=v.end(); it++)
delete *it;
v.clear();
}
for(map::iterator it=m.begin();it!=m.end();++it)
删除它->秒;
相同:
for (map<int, X*>::iterator it = m.begin(); it != m.end(); ++it)
delete it->second;
for(map::iterator it=m.begin();it!=m.end();it++)
删除它->秒;
在C++11中,可以使用auto
跳过迭代器类型
也不需要调用
v.clear()代码>在析构函数中。不,那是完全错误的。您已手动删除资源,而不是使用资源管理类。这是一个非常严重的错误。如果你负责释放它们,你真的想要unique\u ptr
或shared\u ptr
或类似的类,而不是X*
for (map<int,X*>::iterator it = m.begin() ; it != m.end() ; it++ )
delete it->second;
Y类{
私人:
地图m;
向量v;
std::唯一的ptr px;
};
现在不需要自定义析构函数。@OP:注意预增量。最好在迭代器中使用preincrement,如您所见哦,我的。。。我甚至没想到地图有迭代器。对不起打扰了。谢谢。我没有投票否决你,但完全错误地调用它是错误的,虽然你的建议是好的+ 1:我不知道,为什么拇指向下,这是建设性的定义。任何使用原始指针的C++代码都是完全错误的。除非有很好的理由。如果总是判断错误是完全理智和合理的,那就是一种错误,除非为一个非常小的、具体的例外给出了一个非常令人信服的理由。在一般情况下,它总是错误的。不使用C++11是错误的吗?我发现这是一段有效的代码。
for (map<int,X*>::iterator it = m.begin() ; it != m.end() ; it++ )
delete it->second;
class Y {
private:
map<int,std::unique_ptr<X>> m;
vector<std::unique_ptr<X>> v;
std::unique_ptr<X> px;
};