【发布时间】:2014-11-30 17:31:10
【问题描述】:
简介
问题源于对条件接口的需求。可能是因为我陷入了 XY 问题,但是(底线)我最终需要一个共享指针,它可以(基于运行时选择)管理或不管理(拥有或不拥有)资源。
工作至今
以下是关于非拥有共享指针
的一些想法-
使用placement new,例如:
struct MyStruct {}; MyStruct ms1; std::shared_ptr<MyStruct> sp(new(&ms1) MyStruct); -
使用虚拟删除器
std::shared_ptr<MyStruct> spn(new MyStruct, [](MyStruct*){});
问题
- 是否有标准的建议方式?
- 是否有“不要这样做”的规则?
- 至少有更好的方法吗?
注意事项
我的类布局(将使用非拥有共享指针)如下所示:
template<typename T>
struct blah
{
shared_ptr<T> _m;
};
现在,_m 成员可能拥有也可能不拥有基于运行时选择的资源。我不使用weak_ptr 的原因是因为_m 实际上可能是一个拥有指针。
【问题讨论】:
-
为什么不直接使用
weak_ptr,这是它的设计目的还是我遗漏了什么? -
使用
std::weak_ptr,然后可以提取shared_ptr作为局部变量(通过lock())供资源使用。 -
@EdChum 智能指针将成为类成员。我试图避免使用两个成员(一个
weak和一个shared指针)加上一个标志来知道哪个是有效的。有没有办法总是只有 一个 成员? -
@Niall 不是一段有效/工作的代码,只是一个编译片段来推测使用placement new 来拥有非拥有智能指针的可能性。该问题特别询问它是否有效,是否有有效的方法来做到这一点。
-
@NikosAthanasiou。如果两个成员都属于同一个类(对象),我看不出有两个成员的理由。拥有指针(因此指向父对象)拥有它,此时不需要额外的非拥有成员。
标签: c++ c++11 stl smart-pointers c++14