std :: map :: emplace插入裸指针的副本

时间:2017-09-18 14:29:44

标签: c++ std

我有一个代码片段,它使用std :: map :: \ templace将元素插入到地图中。关键是unique_ptr的内部版本。

标准规定:

  

即使容器中已经存在带有键的元素,也可以构造该元素,在这种情况下,新构造的元素将立即被销毁。

在下面的代码片段中,如果构造/破坏了包装器,它将正确地破坏裸指针。如果不是,则该对象将被泄露。该片段只是一个例子。

class Wrapper {
public:
    Wrapper(int* param):
        value(param) {}
    ~Wrapper() { delete value;}
    bool operator<(const Wrapper& other) const { return *value < *other.value;}

private:
    int * value;
};

int main()
{
  std::map<Wrapper, int> map;

  {
    int *key = new int(100);
    map.emplace(key, 5);
  }

  {
    int *keyDuplicate = new int(100);
    map.emplace(keyDuplicate, 10);
  }
}

处理似乎取决于实现。我可以检查返回值并销毁对象(如果它是重复的)。但是如果对象是构造和删除的,我会删除指针两次。

0 个答案:

没有答案