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

时间:2013-08-06 23:26:40

标签: c++ c++11

我正在尝试在我的代码中使用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”指针,认为它是它的唯一拥有者。

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

谢谢,
图莎尔

2 个答案:

答案 0 :(得分:1)

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

请注意,无法向具有自动存储持续时间的对象表示弱所有权语义。

您提到的有关shared_from_this的崩溃可能是由于尝试从未共享的对象获取shared_ptr而导致的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();
}

答案 1 :(得分:1)

  

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

然后你的内部类不能需要weak_ptr。使用weak_ptr 需要使用shared_ptr;它依赖于shared_ptr创建的机制来知道指针何时被销毁。因此,如果您不希望用户必须使用shared_ptr,则无法执行任何期望将该类包含在shared_ptr中的内容。就像从中创建weak_ptr一样。

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

您可以尝试强制用户将堆栈对象包装在使用特殊删除器的shared_ptr中。但这比仅仅分配它更令人讨厌。