我不确定标题,如果不是很清楚,请提前道歉。
以下示例说明了我的问题。
当我使用 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
的链接答案 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参数中调用构造函数的东西。我仍然不知道为什么如果有人知道更多这方面的问题,请详细回答这个问题。