1

我想阻止这样的代码:

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 的所有模板化变体进行这些分配,而不管它们被模板化为的特定类?

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

4

1 回答 1

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

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

  1. 通过unique_ptrin捕获资源captr
  2. 该资源稍后被移动到 shared_ptr sptr使您为captr空。
  3. 该资源现在归sptr.
  4. 的析构函数unique_ptr不会破坏该资源,因为它不再拥有它。

也许这是简化的代码,您正在使用自定义删除器unique_ptr<ClassA>而不是在shared_ptr的构造函数中使用该删除器?或者,也许您的Base班级和Derived班级内部有资源处理错误?另一种选择可能是您在这两段代码之间做错了什么。

于 2013-03-27T11:16:35.180 回答