如果我有这样的多级地图,
std::map<int, std::map<int, int>> myMap;
constructor() {
std::map<int, int> myInsideMap;
myInsideMap.insert(std::make_pair(1,2));
myMap.insert(std::make_pair(1, myInsideMap));
}
destructor() {
// is this cleared correctly?? recursively?
myMap.clear();
}
我希望myMap.clear()也能清除myInsideMap。 它会按预期工作吗?
答案 0 :(得分:3)
我希望myMap.clear()也能清除myInsideMap。它会按预期工作吗?
没有。 myMap.clear()
会销毁myInsideMap
自己的副本。 <{1}}范围退出后,myMap
将不复存在。
标准库容器拥有其元素。当它们被清除或不再存在时,它们的元素也会被破坏。
答案 1 :(得分:1)
引用标准第23.2.1节中关于一般容器要求的说明:
析构函数应用于a的每个元素;所有内存都被解除分配。
我希望myMap.clear()也能清除myInsideMap
不。 myMap清除mapMap的内容,其内部包含一个std :: pair对象,而该对象又包含myInsideMap的副本。
myInsideMap是在堆栈上分配的,因此当构造函数()退出时,当本地作用域结束时,它会被释放。同样,这不是myMap内的myInsideMap(副本)被破坏的地方。
这是否正确清除?递归?
是的,myMap在这里被清除但是递归破坏发生如下 - 在内部调用std :: pair析构函数,其中键和值被破坏。因为,myInsideMap的副本是该对结构中的值,该内容也被销毁。因此,破坏性的“递归”不会触及构造函数()中的本地或实际的myInsideMap。
答案 2 :(得分:-1)
是的,地图将破坏所有组件。您可能需要阅读destructor for map。