介绍
这个问题起源于需要一种条件接口。我可能陷入了XY问题,但(底线是)我最终需要一个共享指针,它将根据运行时选择管理或不管理(拥有或不拥有)资源。
目前的工作
以下是关于非拥有共享指针的一些想法
Using placement new, eg:
struct MyStruct {}; MyStruct ms1; std::shared_ptr<MyStruct> sp(new(&ms1) MyStruct);
Using a dummy deleter
std::shared_ptr<MyStruct> spn(new MyStruct, [](MyStruct*){});
问题
- 是否有标准的建议方式?
- 是否有“不要这样做”的规则?
- 是否至少有更好的方法?
备注
我使用的类布局(其中将使用非拥有共享指针)如下所示:
template<typename T>
struct blah
{
shared_ptr<T> _m;
};
现在,
_m
成员基于运行时的选择可能拥有或不拥有资源。我之所以不使用weak_ptr
,是因为_m
实际上可能是一个拥有指针。
weak_ptr
,这就是它的设计目的,或者我有什么地方理解错了吗? - EdChumstd::weak_ptr
,然后可以通过lock()
提取一个shared_ptr
作为本地变量来使用资源。 - Niallweak
和一个shared
指针)再加上一个标志来知道哪一个是有效的。是否有一种方法始终只有 一个 成员? - Nikos Athanasiouweak_ptr
是唯一有效的选择。shared_ptr
被设计为拥有所有权,如果你不关心对象的管理,那么维护引用计数就没有意义了。使用weak_ptr
只需要一个成员变量。当你实际使用对象时,只需使用本地变量锁定它,不需要标志,weak_ptr::lock
已经表明是否成功。这既容易又直接,并且安全。 - Damon