将没有默认ctor的对象插入到std :: map

时间:2019-02-07 10:50:28

标签: c++

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. 有什么解决方案?

1 个答案:

答案 0 :(得分:1)

  1. 因为下标运算符返回对映射中元素的引用,然后将该元素分配给该元素。为了具有要引用和分配给该对象的对象,必须构造该元素(除非给定键的元素已经碰巧存在)。

  2. a。为避免复制,请:emplaceA直接复制到地图中,而不是复制局部变量。

    b。尽管摆脱不必要的副本是一件好事,但它不能替代固定的课程。使类在分配和复制后具有明确定义的行为,或者使该类不可复制和不可分配。有关更多信息,请参见三(五)规则。

    您绝对不应拥有裸露的指针。相反,使用唯一的指针将以一种优雅的方式修复该类。