有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_this
的 unique_ptr
到 class 不需要做任何特别的事情。但请记住,shared_from_this
不得在 unique_ptr
拥有的实例上调用。因此,这是不安全的。
您无法以安全的方式创建 unique_ptr
到 this
,无论 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
无法实施的原因。
我希望我的构建器方法 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_this
的 unique_ptr
到 class 不需要做任何特别的事情。但请记住,shared_from_this
不得在 unique_ptr
拥有的实例上调用。因此,这是不安全的。
您无法以安全的方式创建 unique_ptr
到 this
,无论 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 asvoid*
缺少共享所有权,这使得 unique_ptr
速度很快,但也是 unique_from_this
无法实施的原因。