Сделал для себя неприятное открытие. Хочу поделиться:
#include <iostream>
using std::cout;
using std::endl;
#include <boost/shared_ptr.hpp>
using boost::shared_ptr;
struct A
{
int magic;
A(): magic(999) // magic number
{
cout << "A::ctor()" << endl;
}
~A() {cout<<"A::dtor()"<<endl;}
void print_magic() { cout<<"go: " << magic << endl;}
};
struct B
{
A &a;
B(shared_ptr<A> spA):a(*spA) // !! инициализиуем ссылку умным указателем :maniac:
{}
B(B &b):a(b.a) {}
};
B make_B()
{
shared_ptr<A> spA(new A);
cout << "make_B" << endl;
return B(spA);
}
int main()
{
B b = make_B();
cout << "Hi!" << endl;
b.a.print_magic();
cout << "Bye!" << endl;
return 0;
}
Запускаем:
A::ctor()
make_B
A::dtor()
Hi!
go: 3277232 //а где же magic?
Bye!
Вот такие грабли. Так что даже с умными указателями и ссылками можно поиметь расстрел стэка.