Грабли при инициализации ссылки умным указателем
От: Mazay Россия  
Дата: 29.09.07 12:58
Оценка: :)
Сделал для себя неприятное открытие. Хочу поделиться:

#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!


Вот такие грабли. Так что даже с умными указателями и ссылками можно поиметь расстрел стэка.
Главное гармония ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.