указатель на объект
От: nicolai  
Дата: 23.05.06 22:51
Оценка:
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

С помощью каких указателей такая проблема решается? Объект должен владеть ссылками на себя?

Добавлена раскраска кода — Кодт
Re: указатель на объект
От: MuTPu4  
Дата: 23.05.06 23:05
Оценка: +1
Здравствуйте, nicolai, Вы писали:

N>С помощью каких указателей такая проблема решается? Объект должен владеть ссылками на себя?

Если предпологается, что m_Device должен обнулиться после delete device, то может помочь пара ::boost::shared_ptr / ::boost::weak_ptr.
Re: указатель на объект
От: Ubivetz Украина  
Дата: 24.05.06 06:15
Оценка:
Здравствуйте, 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; )
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
Re: указатель на объект
От: Smal Россия  
Дата: 24.05.06 07:23
Оценка:
Здравствуйте, nicolai.

Используйте std::auto_ptr. Только аккуратно прочитай доку про него. Он необычно ведет себя при копировании %).
Можно еще boost::shared_ptr.
С уважением, Александр
Re[2]: указатель на объект
От: Bell Россия  
Дата: 24.05.06 13:41
Оценка:
Здравствуйте, Ubivetz, Вы писали:

U> // Молодца! Ты просто присваиваешь указатель!


А это уже запрещено?

U>// А тут естественно Segfault, т.к. ты пытаешься в этом методе использовать уже уничтоженный объект

Точнее неопределенное поведение...

U>В методе SetDiveice тебе необходимо содать копию объекта и её уже присвоить m_Device

Зачем же так категорично — сразу копию? Я не спорю, иногда это единственно возможный выход, но, ИМХО, сходу отметать все остальные варианты, например те же умные указвтели, неверно.

U>...(это поле в конструкторе обнулить, т.е привоить ему NULL, а в деструкторе проверить равно ли оно NULL? Если нет, тогда delete m_Device; )

В деструкторе проверка на нулевой указатель необязательна — вызов delete с нулевым указателем допустим — delete в этом случае просто не выполняет никаких действий.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.