C++ 有没有办法在对象上保留弱引用并控制其生存期?

C++ 有没有办法在对象上保留弱引用并控制其生存期?,c++,boost,c++14,C++,Boost,C++14,shared\u ptr/weak\u ptr允许在对象上保留弱引用,但我不能阻止接收弱引用的人将其转换并存储为共享引用。所以我失去了对对象生存期的控制 unique_ptr可以控制对象的生存期,但没有弱引用机制 我找不到一个标准的方法来同时拥有生命周期控制和弱引用的好处。我不敢相信我是唯一遇到这个问题的人 标准或boost中是否有允许这种行为的内容? 或者,是否有一种模式允许在不重写完整的智能\u ptr类的情况下执行此操作?如果要控制生命周期,它不是弱指针 弱指针可以升级为共享指针。因此,

shared\u ptr/weak\u ptr
允许在对象上保留弱引用,但我不能阻止接收弱引用的人将其转换并存储为共享引用。所以我失去了对对象生存期的控制

  • unique_ptr
    可以控制对象的生存期,但没有弱引用机制

  • 我找不到一个标准的方法来同时拥有生命周期控制和弱引用的好处。我不敢相信我是唯一遇到这个问题的人

    标准或boost中是否有允许这种行为的内容?
    或者,是否有一种模式允许在不重写完整的
    智能\u ptr
    类的情况下执行此操作?

    如果要控制生命周期,它不是弱指针

    弱指针可以升级为共享指针。因此,如果不想共享所有权,则需要传递引用/原始指针


    您可以通过包装一个
    弱\u ptr
    而不公开整个接口来创建自己的受限访问观察者。然而,在多线程设置中(可以说是
    shared\u ptr
    繁荣的唯一设置),这很难保证安全。

    如果您想控制生命周期,它不是一个弱指针

    弱指针可以升级为共享指针。因此,如果不想共享所有权,则需要传递引用/原始指针


    您可以通过包装一个
    弱\u ptr
    而不公开整个接口来创建自己的受限访问观察者。但是,在多线程设置中(可以说是
    shared\u ptr
    繁荣的唯一设置),这很难做到安全。

    好的,没有标准的方法可以做到这一点

    解决方案是向所有对象添加唯一的_id,每个需要弱引用的人都存储一个id

    然后我们有一个管理器,它使用一个公共方法findById(id)保存这些对象的唯一ptr的映射


    这样,内存分配完全由管理器控制,任何人都可以在其上保留弱引用。

    好的,没有标准的方法可以做到这一点

    解决方案是向所有对象添加唯一的_id,每个需要弱引用的人都存储一个id

    然后我们有一个管理器,它使用一个公共方法findById(id)保存这些对象的唯一ptr的映射


    这样,内存分配完全由管理器控制,任何人都可以在上面保留弱引用。

    你是在要求不可能的东西

    如果代码无法延长对象的生存期以覆盖其访问对象的时间,则无法安全地访问对象


    要允许外部代码访问对象,还必须允许该代码延长对象的生存期,以覆盖其访问对象的时间。

    您要求的是不可能的

    如果代码无法延长对象的生存期以覆盖其访问对象的时间,则无法安全地访问对象


    要允许外部代码访问对象,还必须允许该代码延长对象的生存期,以覆盖其访问对象的时间。

    相关。还有
    std::experimental::observer_ptr
    ,但当唯一的_ptr被删除时,它不会变为null。这就是
    弱_ptr
    的点。当客户端使用引用的对象时,它会在使用期间将其转换为共享对象,以便不会将其删除。拥有
    弱\u ptr
    的客户端在使用对象之前需要以某种方式承担对象生存期的部分所有权。在唯一\u ptr的情况下,不需要类似弱\u ptr的机制,因为存储在其中的对象的生存期必须超过其所有引用的生存期,并且引用此对象的所有代码都可以使用这些参考资料无需任何额外检查。若代码的某些部分实际上可能期望该对象不存在,那个么最好让它通过类似.Related的方式访问该对象。还有
    std::experimental::observer_ptr
    ,但当唯一的_ptr被删除时,它不会变为null。这就是
    弱_ptr
    的点。当客户端使用引用的对象时,它会在使用期间将其转换为共享对象,以便不会将其删除。拥有
    弱\u ptr
    的客户端在使用对象之前需要以某种方式承担对象生存期的部分所有权。在唯一\u ptr的情况下,不需要类似弱\u ptr的机制,因为存储在其中的对象的生存期必须超过其所有引用的生存期,并且引用此对象的所有代码都可以使用这些参考资料无需任何额外检查。如果代码的某些部分实际上可能认为该对象不存在,那么最好让它通过类似的方式访问该对象。这是行不通的。您调用
    findById(id)
    并返回一个对象,该对象可能随时消失,也可能不会消失,因为其他对象控制其生命周期?!你怎么能用这个?这与不能升级为强指针的弱指针完全相同,也没有任何用处。没错,findById(id)返回我称之为TransientPtr的指针,该指针必须在使用前进行测试,并且永远不能复制或存储。所以我在很短的范围内使用这个对象,只要我不在我使用它的范围内破坏它,就没有问题。我认为自定义弱\u ptr也有同样的问题,如果我不能将其升级为强指针,那么在确保共享\u ptr仍然有效的情况下,就无法使用它。与自定义弱_ptr相比,它的优势在于,在我的情况下,对象可以在以后(从服务器)销毁和重新创建,并且我的id仍然有效。那么,为什么还要麻烦使用id呢?为什么不把一个
    weak_ptr
    封装在一个只能翻转的类中呢