清除多级std :: map

时间:2016-01-18 06:55:33

标签: c++ stdmap

如果我有这样的多级地图,

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。 它会按预期工作吗?

3 个答案:

答案 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