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

Is there unique_from_this()? Or how return unique_ptr from class inherited from enable_shared_from_this

我希望我的构建器方法 Class::create() 到 return unique_ptr

为什么?

1) 此设计未强制执行共享所有权(和原子锁)。 unique_ptr 非常有效并且大小与 void*

相同

2) 不过,在 class 用户端 移动到 shared_ptr 很容易(但仅当客户端想要共享实例时多重所有权)

所以。我只想为我正在使用的东西付费

但是。我需要一些 class 实例的方法到 return "this" 指针。 如果我从 enable_shared_from_this 继承 class 我只是使用 return shared_from_this 但我认为它不会与唯一所有权相关

换句话说, class 中某处创建的 unique_ptr(当然不使用 shared_from_this())是否会以某种方式与(潜在的)由此 unique_ptr 创建的 shared_ptr 相关?还是会导致双删问题?

In other words, will the unique_ptr created somewhere in class (without using shared_from_this() of course) somehow be related to (potential) shared_ptr created from this unique_ptr? Or it will lead to double deletion problem?

shared_ptr 构造函数将检测您可公开访问的 enable_shared_from_this 基,所以是的,如果 unique_ptr 正确释放其指针,您将不会有双重删除,并且 shared_from_this() 成员将正常工作(但如果客户端在没有现有 shared_ptr 管理它的情况下调用它,您将获得 UB):

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 ...

此外,由于 C++17 shared_from_this() 从非共享实例调用时会抛出 bad_weak_ptr

Is there unique_from_this()?

没有

Or how return unique_ptr from class inherited from enable_shared_from_this

一般来说,从 return 继承自 enable_shared_from_thisunique_ptr 到 class 不需要做任何特别的事情。但请记住,shared_from_this 不得在 unique_ptr 拥有的实例上调用。因此,这是不安全的。

您无法以安全的方式创建 unique_ptrthis,无论 enable_shared_from_this 是否继承。

1) This design is not enforcing the shared ownership (and atomic lock). unique_ptr is very efficient and has same size as void*

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