2

我正在尝试找出一种在我的代码中使用 shared_ptr 和 weak_ptr 的方法。我有两个班——一班和二班。One 的内部类中的两个。类二的构造函数接受类一的一个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”指针,认为它是它的唯一所有者。

我怎么解决这个问题?还是我的程序在架构上不正确?任何建议将不胜感激。

谢谢,
图沙尔

4

2 回答 2

2

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

那么你的内部类不能需要一个weak_ptr. 使用 aweak_ptr 需要使用shared_ptr; 它依赖于shared_ptr创建知道指针何时被销毁的机器。因此,如果您不希望用户必须shared_ptr使用shared_ptr. weak_ptr就像从中创建一个。

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

您可以尝试一些方法,强制用户将他们的堆栈对象包装在shared_ptr使用特殊删除器的 a 中。但这比仅仅堆分配它要烦人得多。

于 2013-08-06T23:48:42.497 回答
1

下面是使用enable_shared_from_this从 传递弱所有权语义的示例this

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

您提到的崩溃可能是由于尝试从未共享的对象中获取 shared_ptr 而导致shared_from_this的类型异常。std::bad_weak_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();
}
于 2013-08-06T23:48:27.090 回答