将此指针作为weak_ptr传递给内部类

Passing this pointer to inner class as a weak_ptr

本文关键字:ptr 内部类 weak 指针      更新时间:2023-10-16

我正在尝试在代码中使用shared_ptr和weak_ptr的方法。我有两个班——一班和二班。一个内部类中的两个。类二的构造函数接收类一的weak_ptr,如下所示,并将其存储以备将来使用。

Class One  
{    
    Class Two    
    {  
    private:
      std::weak_ptr<One> m_wptrOne;
    public:
      Two(std::weak_ptr<One> wptrOne)
      {
          m_wptrOne = wptrOne;
          /* m_wptr is used later by class Two if not expired and valid ofcourse */
      }
  }; // End Class Two
  .....
  void foo()  
  {  
       std::shared_ptr sptrOne(this); 
       Two obj(sptrOne);  
    .... /* do my work */  
  } // Program crashes when foo terminates 
}; //End Class One

当我的函数foo返回时,我会崩溃,因为我认为"sptr"试图释放"this"指针,认为它是它的唯一所有者。

我该如何解决这个问题?或者我的程序在体系结构上不正确?任何建议都将不胜感激。

谢谢,
Tushar

我不想强制我的库用户在堆上创建对象作为共享指针。

那么您的内部类不能需要weak_ptr。使用weak_ptr需要使用shared_ptr;它依赖于CCD_ 4创建的机制来知道指针何时被破坏。因此,如果您不希望用户必须使用shared_ptr,则不能执行任何期望类封装在shared_ptr中的操作。比如从中创建一个weak_ptr

因此,如果希望用户不在堆上创建这些对象,则需要使内部类独立于weak_ptr

您可以尝试强制用户将其堆栈对象包装在使用特殊deleter的shared_ptr中。但这远比堆分配要麻烦得多。

下面是使用enable_shared_from_thisthis传递弱所有权语义的示例。

请注意,对于具有自动存储持续时间的对象,不可能表达弱所有权语义。

您提到的关于shared_from_this的崩溃可能是std::bad_weak_ptr类型的异常,原因是试图从未共享的对象获取shared_ptr。

#include <memory>
class One   : public std::enable_shared_from_this<One>
{    
public:
    class Two    
    {  
    private:
      std::weak_ptr<One> m_wptrOne;
    public:
      Two(std::weak_ptr<One> wptrOne)
      {
          m_wptrOne = wptrOne;
          /* m_wptr is used later by class Two if not expired and valid ofcourse */
      }
  }; // End Class Two
  //.....
  void foo()  
  {  
       std::shared_ptr<One> sptrOne = shared_from_this(); 
       Two obj(sptrOne);  
    //.... /* do my work */  
  } // Program crashes when foo terminates 
}; //End Class One

int main()
{
    auto one = std::make_shared<One>();
    one->foo();
}