从地图上删除/擦除对象时的析构函数调用

时间:2019-05-22 08:31:59

标签: c++ stl destructor

我有一个疑问,我有一个映射,该映射现在针对某些任意字符串存储类对象,当我从映射中删除任何元素(使用擦除/删除api)时,存储在该元素中的类对象的析构函数将被调用吗? 另外,当我插入类对象是针对字符串值的地图时,将调用类的ctor并将在地图中创建对象的副本。我的理解在这里正确吗? 任何解释这些情况的链接都将有所帮助。

下面的代码将调用类Myclass的副本构造函数吗?我尝试在MyClass复制ctor中添加一个cout,但在输出中没有看到它。

注意:对象按值存储在map中。

QMap<QString, MyClass> testMap;
MyClass obj;
testMap.insert("test", obj);
testMap.remove("test");

1 个答案:

答案 0 :(得分:1)

由于对象是按值存储的,因此您将在地图中存储新的实例。这意味着将在插入时调用ctor。在大多数插入中,将使用复制/移动ctor,但是可以使用emplace...方法选择其他ctor。当您在向量中创建默认值时,会通过使用默认值ctor来设置其初始大小或将其扩展。

同样,当从地图上删除或删除对象时,该对象将被销毁,因此将调用其dtor。对此没有什么特别的魔术:对象生命周期的常规规则在这里适用。