【问题标题】:inserting object with no default ctor to std::map [duplicate]将没有默认 ctor 的对象插入到 std::map [重复]
【发布时间】:2019-07-01 11:14:50
【问题描述】:
class A
{
  public:
    A(int i)
    {
      x = new int(i);
    }
    ~A()
    {
      if (x != NULL)
      {
        delete x;
        x = NULL;
      }
    }
  private:
    A();
    int *x;
};

void f()
{
  {
    map<int,A> myMap;
    A a(2);
    // myMap[7] = a;  // cannot access default ctor
    pair<int, A> p(7,a);
    myMap.insert(p);
  }
}

这里的问题是,在范围退出时,A 的析构函数被调用了两次。可能是第一次破坏A a(2),第二次破坏map创建的一些临时对象。这会导致异常,因为 x 未分配。

  1. 为什么命令myMap[7] = a会构造一个新的A,为什么它使用默认的ctor?
  2. 有什么解决办法?

【问题讨论】:

  • 你必须声明复制构造函数,operator=,你也应该声明移动构造函数。
  • 你看过this thread吗?

标签: c++


【解决方案1】:
  1. 因为下标运算符返回对地图中元素的引用,然后您将其分配给该元素。为了有一个对象可以引用和分配,必须构造该元素(除非给定键的元素已经存在)。

  2. 一个。避免复制:直接将emplaceA 复制到映射中,而不是复制局部变量。

    b.虽然摆脱不必要的副本是一件好事,但它不能替代修复你的课程。要么使类在分配和复制后具有明确定义的行为,要么使类不可复制和不可分配。有关详细信息,请参阅三(五)规则。

    你永远不应该拥有裸露的指针。使用唯一指针会以一种优雅的方式修复类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2019-08-19
    • 1970-01-01
    • 2020-02-06
    相关资源
    最近更新 更多