2015-07-16 5 views
0

Я не был уверен в названии, поэтому извиняюсь заранее, если это не очень понятно.Доступ к ссылочной переменной из shared_ptr

Приведенный ниже пример иллюстрирует мою проблему.

Когда я использую новый инициализировать 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

Fixed при изменении конструктора из:

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

в

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

Есть что-то о вызове конструктора внутри аргументов make_shared. Я все еще не знаю, почему так, если кто-нибудь знает об этом, пожалуйста, ответьте на вопрос подробно.

Смежные вопросы