0

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

下面的例子说明了我的问题。

当我使用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

4

1 回答 1

0

从以下位置更改构造函数时已修复:

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

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

关于在 make_shared 参数中调用构造函数的方法。我仍然不知道为什么,所以如果有人对此了解更多,请详细回答问题。

于 2015-07-16T10:27:48.760 回答