防止从unique_ptr到shared_ptr的分配

时间:2013-03-17 05:40:19

标签: c++ templates stl

我想阻止这样的代码:

unique_ptr<ClassA> captr = unique_ptr<ClassA>(new ClassA());
....
shared_ptr<Base> sptr = move(captr);

此代码应生成编译器错误,但它会在运行时编译并生成双重释放和其他奇怪错误。将unique_ptr分配给shared_ptr毫无意义。如果某些东西被声明为unique_ptr,那么它不应该被共享。但是如果允许将unique_ptr赋值给shared_ptr,那么这个限制就消失了。

不幸的是,当一些函数返回unique_ptr并且有些函数将shared_ptr作为参数时,这个错误太容易了。

问题是:我如何禁止对unique_ptr和shared_ptr的所有模板化变体进行这些赋值,而不管它们被模板化为哪个特定类?

我正在考虑将赋值运算符声明为已删除,但我不确定这样的声明是什么样的。

1 个答案:

答案 0 :(得分:9)

unique_ptr<ClassA> captr = unique_ptr<ClassA>(new ClassA());
....
shared_ptr<Base> sptr = move(captr);

这确实是正确的代码。这里发生的事情是:

  1. 通过unique_ptr中的captr抓取资源。
  2. 资源稍后移至shared_ptr sptr,使您的captr为空。
  3. 资源现在归sptr所有。
  4. unique_ptr的析构函数不会破坏该资源,因为它不再拥有它。
  5. 也许这是简化代码,您使用unique_ptr<ClassA>的自定义删除工具而不在shared_ptr的构造函数中使用该删除工具? 或者,您的Base类和Derived类可能在内部有资源处理错误? 另一种选择可能是你在这两段代码之间做错了。