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

标签 c++ c++11

我正在尝试找出一种在我的代码中使用shared_ptr和weak_ptr的方法。我有两个类(class)——一类和二类。 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”指针,认为它是它的唯一所有者。

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

谢谢,
图沙尔

最佳答案

I don't want to make it compulsory for my library users to create the object on the heap as a shared pointer.

那么你的内部类不能需要一个weak_ptr。使用weak_ptr需要使用shared_ptr;它依赖于 shared_ptr 创建的机制来了解指针何时被销毁。因此,如果您不希望用户必须使用 shared_ptr,则不能执行任何期望将类包装在 shared_ptr 中的操作。就像从中创建一个 weak_ptr 一样。

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

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

关于c++ - 将此指针作为weak_ptr传递给内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18092184/

相关文章:

c++ - std::forward 不传递左值引用

c++ - 模板类中的模板

c++ - 将 vector 元素复制到 vector 对

c++ - 我可以在 c++11 中的 std::deque 上使用 std::max_element() 吗?

c++ - 安全地传递指针所有权异常

文件打开和文件输出的 C++ 问题

C++ 11可变数量的参数,相同的特定类型

c++ - std::map 通过变换替换现有元素

c++ - 在 C++0x 中传递/移动构造函数的参数

multithreading - 如何在 C++ 中 printf() std::this_thread::get_id()?