【发布时间】:2017-12-01 10:44:59
【问题描述】:
我希望我的构建器方法 Class::create() 返回 unique_ptr
为什么?
1) 这种设计不强制共享所有权(和原子锁)。 unique_ptr 非常高效,大小与void* 相同
2) 尽管如此,移动到shared_ptr 在类用户端仍然很容易(但仅当客户希望共享实例以获得多个所有权时)
所以。我只想为我正在使用的东西付费
但是。我需要一些类实例的方法来返回“this”指针。
如果我从enable_shared_from_this 继承类,我只使用return shared_from_this,但我认为它与唯一所有权无关
换句话说, 在类中某处创建的 unique_ptr(当然不使用 shared_from_this())会以某种方式与从这个 unique_ptr 创建的(潜在的)shared_ptr 相关吗?还是会导致双重删除问题?
【问题讨论】:
-
TBH 我不确定这是否有意义,因为
this可以很容易地放入unique_ptr,并且没有像shared_ptr那样需要解决的问题。 -
所以让我们看看 - 我返回了 unique_ptr 和一些 Owner 类。然后它移动到 shared_ptr 并将句柄提供给 OtherOwner 等其他类,以便它们保持强共享引用。但是我怎么能从类实例本身找到这个共享组呢?
-
这没有任何语义意义。如果有一个对象可以调用这个成员函数,那么它已经被 something 拥有。在一般情况下,如何获得唯一的所有者?
-
@StoryTeller 确实如此。例如,我在 Controller 类中创建 Widget。我希望一个小部件能够创建层次结构。所以我用:
shared_ptr widget1 = move(Widget::create())构建 Widget。然后 auto child = widget1->createChild() 每个孩子都应该收到父母的 shared_ptr -> 要在 Child 内的 weak_ptr 中转换。这意味着在 createChild 我必须访问 shared_from_this() -
@StoryTeller-UnslanderMonica 我知道,有点晚了,但是:IMO,实际的问题是:enable_shared_from 这个本身是否经常在软件设计的错误地方使用? shared_from_this 的问题是:它以某种方式强制使用结构/类的方式(侵入性),这与类的“内部”语义重叠。用 enable_shared_from_this 标记类很快,但是一旦你想在不同的上下文范围内使用类,重新设计就会变得很混乱。
标签: c++ memory-management shared-ptr smart-pointers unique-ptr