Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以拥有不属于我的共享指针吗? 简介_C++_C++11_Stl_Smart Pointers_C++14 - Fatal编程技术网

C++ 我可以拥有不属于我的共享指针吗? 简介

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

这个问题源于对有条件接口的需要。可能是这样,我陷入了一个XY问题,但(底线)我最终需要一个共享指针(基于运行时的选择)来管理或不管理(拥有或不拥有)资源

工作至今 以下是关于非拥有共享指针的一些想法

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可以