class FooClass
{
private:
DeviceClass *m_Device;
public:
void setDevice(DeviceClass *device)
{
m_Device = device;
}
void draw()
{
if(m_Device)
m_Device->draw_something();
}
};
DeviceClass *device = new DeviceClass;
FooClass user;
user.setDevice(device);
user.draw();
delete device;
user.draw(); <- trouble
С помощью каких указателей такая проблема решается? Объект должен владеть ссылками на себя?
Добавлена раскраска кода — Кодт
Здравствуйте, nicolai, Вы писали:
N>С помощью каких указателей такая проблема решается? Объект должен владеть ссылками на себя?
Если предпологается, что m_Device должен обнулиться после
delete device, то может помочь пара
::boost::shared_ptr /
::boost::weak_ptr.
Здравствуйте, nicolai, Вы писали:
N>class FooClass
N>{
N>private:
N> DeviceClass *m_Device;
N>public:
N> void setDevice(DeviceClass *device)
N> {
// Молодца!

Ты просто присваиваешь указатель!
N> m_Device = device;
N> }
N> void draw()
N> {
// Если тут m_Device уничтожен, то естественно выскочит Segfault!
N> if(m_Device)
N> m_Device->draw_something();
N> }
N>};
N>DeviceClass *device = new DeviceClass;
N>FooClass user;
N>user.setDevice(device);
N>user.draw();
// Тут ты уничтожаешь объект
N>delete device;
// А тут естественно Segfault, т.к. ты пытаешься в этом методе использовать уже уничтоженный объект
N>user.draw(); <- trouble
N>С помощью каких указателей такая проблема решается? Объект должен владеть ссылками на себя?
В методе SetDiveice тебе
необходимо содать копию объекта и её уже присвоить m_Device (это поле в конструкторе обнулить, т.е привоить ему NULL, а в деструкторе проверить равно ли оно NULL? Если нет, тогда delete m_Device; )
Здравствуйте, nicolai.
Используйте std::auto_ptr. Только аккуратно прочитай доку про него. Он необычно ведет себя при копировании %).
Можно еще boost::shared_ptr.
Здравствуйте, Ubivetz, Вы писали:
U> // Молодца!
Ты просто присваиваешь указатель!
А это уже запрещено?
U>// А тут естественно Segfault, т.к. ты пытаешься в этом методе использовать уже уничтоженный объект
Точнее неопределенное поведение...
U>В методе SetDiveice тебе необходимо содать копию объекта и её уже присвоить m_Device
Зачем же так категорично — сразу копию? Я не спорю, иногда это единственно возможный выход, но, ИМХО, сходу отметать все остальные варианты, например те же умные указвтели, неверно.
U>...(это поле в конструкторе обнулить, т.е привоить ему NULL, а в деструкторе проверить равно ли оно NULL? Если нет, тогда delete m_Device; )
В деструкторе проверка на нулевой указатель необязательна — вызов delete с нулевым указателем допустим — delete в этом случае просто не выполняет никаких действий.