【问题标题】:Destructor call when an object is removed/erased from a map从地图中删除/擦除对象时的析构函数调用
【发布时间】:2019-10-08 16:30:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这取决于您在地图中存储对象的方式。如果它们是指向某个对象的指针,则不会调用该对象的析构函数。如果它们按价值存储,它会。插入也是如此。
  • 您可以自己构建这样的地图来尝试。在构造函数和析构函数中使用日志语句来查看它们是否被调用。
  • 任何人有任何链接可以让我了解这些情况下的预期行为吗?
  • 尚未明确检查,但通常您应该在cpp reference 上找到任何相关内容。
  • 如果你愿意深入挖掘,你可能会得到一个standard 的版本(最新的草稿,免费的,应该也可以)。

标签: c++ stl destructor


【解决方案1】:

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

同样,当一个对象从地图中移除或擦除时,它会被销毁,因此它的 dtor 将被调用。没有什么特别的神奇之处:这里应用了对象生命周期的常用规则。

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 2021-04-10
    • 2012-03-13
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2019-01-29
    • 2020-04-18
    相关资源
    最近更新 更多