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;
};