从shared_ptr

时间:2015-07-16 09:18:51

标签: shared-ptr make-shared

我不确定标题,如果不是很清楚,请提前道歉。

以下示例说明了我的问题。

当我使用 new 从成员初始化列表初始化shared_ptr时,当我为& ref_bar分配值时,一切似乎都正常。但是,当我使用 make_shared 尝试同样的事情时,这是首选的方式,它不起作用。

你能否解释一下发生这种情况会发生什么?

请忽略"坏"在以下示例中编码。我创建了这个来说明我的问题。我对shared_ptr。

的重要性感兴趣
#include <iostream>
#include <memory>

class Bar
{
   int m_bar;

   public:
      int &ref_bar;

      Bar(int bar_) : m_bar(bar_),ref_bar(m_bar)
      {;}
      void print()
      {
         std::cout<< "m_bar = "<<m_bar<<std::endl;
      }
};

struct Foo
{
   std::shared_ptr<Bar> m_foo;

   Foo() : m_foo( std::make_shared<Bar>(Bar(23)) )   // Ex.1
   //Foo() : m_foo( new Bar(23) )                    // Ex.2
   {
      m_foo->print();
      m_foo->ref_bar = 12;
      m_foo->print();
   }
};

int main()
{
   Foo f;
}

结果是:

Ex.1 >> 23,23   Wrong.
Ex.2 >> 23,12   Ok.

这是指向ideone:http://ideone.com/xluYQ9

的链接

1 个答案:

答案 0 :(得分:0)

在更改构造函数时修复:

Foo() : m_foo( std::make_shared<Bar>(Bar(23)) )   // Ex.1

Foo() : m_foo( std::make_shared<Bar>(23) )   // Ex.1

有一些关于在make_shared参数中调用构造函数的东西。我仍然不知道为什么如果有人知道更多这方面的问题,请详细回答这个问题。