C++ 我可以拥有不属于我的共享指针吗? 简介
这个问题源于对有条件接口的需要。可能是这样,我陷入了一个XY问题,但(底线)我最终需要一个共享指针(基于运行时的选择)来管理或不管理(拥有或不拥有)资源 工作至今 以下是关于非拥有共享指针的一些想法C++ 我可以拥有不属于我的共享指针吗? 简介,c++,c++11,stl,smart-pointers,c++14,C++,C++11,Stl,Smart Pointers,C++14,这个问题源于对有条件接口的需要。可能是这样,我陷入了一个XY问题,但(底线)我最终需要一个共享指针(基于运行时的选择)来管理或不管理(拥有或不拥有)资源 工作至今 以下是关于非拥有共享指针的一些想法 std::shared_ptr<MyStruct> spn(new MyStruct, [](MyStruct*){}); 使用新的布局,例如: struct MyStruct {}; MyStruct ms1; std::shared_ptr<MyStruct> s
std::shared_ptr<MyStruct> spn(new MyStruct, [](MyStruct*){});
struct MyStruct {};
MyStruct ms1;
std::shared_ptr<MyStruct> sp(new(&ms1) MyStruct);
struct MyStruct{};
MyStruct ms1;
std::shared_ptr sp(新建(&ms1)MyStruct);
std::shared_ptr<MyStruct> spn(new MyStruct, [](MyStruct*){});
std::shared_ptr spn(新MyStruct,[](MyStruct*){};
- 是否有一个标准的建议方式李>
- 有“不要做”的规定吗
- 至少有更好的方法吗李>
template<typename T>
struct blah
{
shared_ptr<T> _m;
};
模板
结构废话
{
共享的ptr;
};
现在,基于运行时选择,
\u m
成员可以拥有资源,也可以不拥有资源。我不使用弱ptr
的原因是\u m
实际上可能是一个拥有指针。放置新建
将在销毁时给您提供未定义的行为(可能会崩溃)-它会立即调用删除非使用新建
创建的对象
我会选择无操作删除器。这个设计可能看起来很奇怪,但如果你需要这样的行为(并充分记录下来),它就会起作用。我曾在一个项目中使用过类似的东西,但后来我不再需要它了。新的位置显然是UB,因为它会在代码片段中尝试删除堆栈上的某些内容。空的删除器版本将工作,但将分配一个引用计数块
诀窍是使用疯狂的shared\u ptr
构造函数:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
这是标准保证的noexcept
,不会分配任何内容。该标准甚至有一条注释说
[注意:此构造函数允许创建空的共享\u ptr
具有非空存储指针的实例。-结束说明]
为什么不直接使用弱ptr
,这就是它的设计目的,或者我遗漏了什么?使用std::弱ptr
,然后您可以提取共享ptr
作为局部变量(通过锁()
)来使用资源。@EdChum智能指针将是类成员。我试图避免使用两个成员(一个弱
和一个共享
指针)加上一个标志来知道哪一个是有效的。有没有办法总是只有一个成员?@Niall不是一段有效的代码,只是一段编译片段,用来推测使用placement new来拥有非自有智能指针的可能性。这个问题特别问它是否有效,是否有一个有效的方法来做它。@NikosAthanasiou。如果两个成员都属于同一个类(对象),我看不出有理由使用两个成员。拥有它的指针(以及指向父对象的指针)拥有它,此时不需要额外的非拥有成员。我想摆脱它的需要是一个很大的赌注;这就是为什么boost有boost::null_deleter,它曾一度隐藏在序列化代码中,但现在在核心中。当您需要求助于此时,这几乎总是不幸的,但是如果您不能更改API,您就不能。。。。(编辑)如果您所做的只是尝试拥有一个可能不属于您的指针,那么shared_ptr就太过分了;滚动您自己的便利类,或者将unique_ptr与保留布尔值的deleter一起使用,告诉它是否需要释放。如果在拥有所有权的情况下需要共享所有权,则shared_ptr可以