清除多级 std::map

clear multi-level std::map

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

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。 它会像我预期的那样工作吗?

是的,地图会破坏所有组件。您可能想阅读有关 destructor for map.

的内容

I expect myMap.clear() will clear myInsideMap too. would it be working that I expected?

没有。 myMap.clear() 将销毁它自己的 myInsideMapcopymyMap 将在 constructor() 作用域退出时不复存在。

标准库容器拥有自己的元素。当它们被清除或不复存在时,它们的元素也会被销毁。

引用标准第 23.2.1 节中关于一般容器要求的注释:

析构函数应用于a的每个元素;所有内存都被释放。

I expect myMap.clear() will clear myInsideMap too

没有。 myMap 仅清除 mapMap 的内容,其中包含一个 std::pair 内部对象,而该对象又具有 myInsideMap 的副本。

myInsideMap 被分配在堆栈上,因此当 constructor() 退出时它的局部范围结束时它被释放。同样,这不是 myMap 内部的 myInsideMap(副本)被破坏的地方。

is this cleared correctly?? recursively?

是的,myMap 在这里被清除,但是递归销毁发生如下 - std::pair 析构函数在内部被调用,键和值被销毁。由于 myInsideMap 的副本是此对结构中的值,因此该内容也被销毁了。所以破坏性的 "recursion" 不会触及 constructor() 中的本地或实际的 myInsideMap。