从 shared_ptr 访问引用变量
Accessing reference variable from shared_ptr
我不确定标题,如果不是很清楚,请提前致歉。
下面的例子说明了我的问题。
当我使用 new 从成员初始化列表中初始化 shared_ptr 然后当我为 &ref_bar 赋值时,一切似乎都有效美好的。然而,当我用 make_shared 尝试同样的事情时,这是首选的方式,它不起作用。
您能否解释一下发生这种情况的幕后原因?
请忽略下面例子中的"bad"编码。我创建这个是为了说明我的问题。我对 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.
这是一个 link 的想法:http://ideone.com/xluYQ9
在更改构造函数时已修复:
Foo() : m_foo( std::make_shared<Bar>(Bar(23)) ) // Ex.1
至
Foo() : m_foo( std::make_shared<Bar>(23) ) // Ex.1
在 make_shared 参数中调用构造函数有些问题。我仍然不知道为什么,所以如果有人对此有更多了解,请详细回答问题。
我不确定标题,如果不是很清楚,请提前致歉。
下面的例子说明了我的问题。
当我使用 new 从成员初始化列表中初始化 shared_ptr 然后当我为 &ref_bar 赋值时,一切似乎都有效美好的。然而,当我用 make_shared 尝试同样的事情时,这是首选的方式,它不起作用。
您能否解释一下发生这种情况的幕后原因?
请忽略下面例子中的"bad"编码。我创建这个是为了说明我的问题。我对 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.
这是一个 link 的想法:http://ideone.com/xluYQ9
在更改构造函数时已修复:
Foo() : m_foo( std::make_shared<Bar>(Bar(23)) ) // Ex.1
至
Foo() : m_foo( std::make_shared<Bar>(23) ) // Ex.1
在 make_shared 参数中调用构造函数有些问题。我仍然不知道为什么,所以如果有人对此有更多了解,请详细回答问题。