2013-03-17 34 views
1

我想阻止这样的代码:从预防的unique_ptr分配到shared_ptr

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

此代码应生成编译器错误,而是它编译并在运行时产生双重释放并其他奇怪的错误。为shared_ptr指定unique_ptr根本没有意义。如果声明了unique_ptr,它并不意味着被共享。但是,如果允许将unique_ptr分配给shared_ptr,则此限制将消失。

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

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

我在想像是声明一个赋值操作符被删除,但我不确定这样的声明是什么样的。

+5

-1“将shared_ptr指定给shared_ptr毫无意义。”是不正确的。问题出在你的课堂'A'上。你忘了表明这一点。 – 2013-03-17 05:45:05

+0

这并不是因为如果我将某些东西声明为“独特”,那么有人不能将它分享。这个不成立。一个独特的指针应该是唯一的,即全球任何时候都只有一个实例。 – mkschreder 2013-03-17 05:48:37

+6

@ user1953157:他们不能“只是让它共享”,他们必须拥有所有权,然后明确地输出“移动”。如果你不想失去某些东西的所有权,请不要移动它!考虑到需要做特殊的工作来允许这个('shared_ptr'有一个构造函数),你认为这是一个错误? – GManNickG 2013-03-17 05:59:02

回答

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

这确实是正确的代码。这到底是怎么发生的事情是:

  1. 的资源是通过在captrunique_ptr抓获。
  2. 该资源稍后移动到shared_ptr sptr使您的captr为空。
  3. 该资源现由sptr所有。
  4. unique_ptr的析构函数不会销毁该资源,因为它不再拥有它。

也许这是简化代码,您正在使用unique_ptr<ClassA>一个定制删除,而不是使用shared_ptr的构造函数缺失者? 或者,也许你的Base类和Derived类内部有一个资源处理错误? 另一种选择可能是你在这两段代码之间做了错误的事情。

相关问题