有unique_from_this()吗?或者如何从继承自enable_shared_from_this

时间:2017-12-01 10:44:59

标签: c++ memory-management shared-ptr smart-pointers unique-ptr

我希望构建器方法Class::create()返回unique_ptr

为什么呢?

1)此设计不强制执行共享所有权(和原子锁)。 unique_ptr效率很高,且与void*

的大小相同

2)但是,很容易转移到班级用户方的shared_ptr (但仅当客户希望共享多个所有权的实例时)< / p>

因此。我只想支付我使用

的费用

但是。我需要一些类实例的方法来返回&#34;这个&#34;指针。 如果我从enable_shared_from_this继承课程,我只使用return shared_from_this,但我认为它不会与独特的所有权相关

换句话说, 将unique_ptr创建在类的某个地方(当然不使用shared_from_this())某种程度上与从这个unique_ptr创建的(潜在的)shared_ptr有关吗?或者它会导致双重删除问题?

2 个答案:

答案 0 :(得分:1)

  

换句话说,unique_ptr是否会在类中的某个地方创建(当然不使用shared_from_this())以某种方式与从此unique_ptr创建的(潜在)shared_ptr相关联?或者它会导致双重删除问题?

public static int getW() { int width = ((WindowManager) appContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(); return width; } 构造函数将检测您的可公开访问的shared_ptr库,所以是的,如果enable_shared_from_this正确释放其指针,则您将没有双重删除和unique_ptr成员将正常工作(但如果客户端调用它而没有现有的shared_ptr管理它,你将获得UB):

shared_from_this()

此外,由于C ++ 17 auto unique = Class::create(); auto shared = std::shared_ptr<Class>{ std::move(unique) }; // ok, pass ownsership to shared auto shared_again = shared->shared_from_this(); // ok auto unique2 = Class::create(); auto badly_shared = unique2->shared_from_this(); // nope, UB auto badly_shared_again = std::shared_ptr<Class>{ unique2.get() }; // nope, double deletion coming ... 在从非共享实例调用时会抛出shared_from_this()

答案 1 :(得分:1)

  

是否有unique_from_this()?

没有

  

或者如何从继承自enable_shared_from_this

的类返回unique_ptr

通常,要将unique_ptr返回到从enable_shared_from_this继承的类,没有什么特别的。但请记住,shared_from_this所拥有的实例不得调用unique_ptr。因此,这是不安全的。

无论是否继承unique_ptr,您都无法以安全的方式创建thisenable_shared_from_this

  

1)此设计不强制执行共享所有权(和原子锁)。 unique_ptr效率很高,且与void*

的大小相同

缺乏共享所有权,这使得unique_ptr速度快,也是unique_from_this无法实现的原因。