Почему я создал потенциальный блуждающий указатель при удалении здесь в деструкторе?

0

Моя программа вылетает при выходе. Отслеживая ошибку, я пришел к деструктору класса gWSW. Вот проблема:

У меня есть класс gShop: public gTexture. В этом классе объявляю и инициализирует указатель на объект класса gWSW.

В gWSW я снова указываю объект, объявленный и инициализированный классом gTexture.

Я дал каждому классу надлежащий деструктор с вызовом delete в указателях.

Программа работает нормально, пока я не нажимаю ESC, и все дескрипторы вызываются. Здесь он падает в деструкторе gWSW. То есть у меня есть что-то вроде этого:

class gShop : public gTexture
   {
   public:
       gShop(): pWSW(new gWSW()) {}
      ~gShop(){delete pWSW;}   

   gWSW*    pWSW;
   };

class gWSW 
   {
   public:
       gWSW():gWSW: pTextuer(new gTexture()) {}
      ~gWSW(){delete pTexture;}   

   gTexture*    pTexture;
   };

class gTexture 
   {
   public:
       gTexture() {}
      ~gTexture();

//... a pointer to char[] here but will be also deleted in its destructor
   };

Последний вызов перед сбоем находится в ~ gWSW(). Комментируя вывод "delete pTexture", программа выходит из строя без ошибок или сбоев. Прежде чем продолжить и оставить комментарий, мне нравится понимать, в чем проблема.

Теги:
class
pointers

1 ответ

0

О, я считаю, что нашел ответ. Прошло некоторое время с тех пор, как я посетил "стек". Мне нужно создать собственный конструктор копирования и, таким образом, предоставить глубокую копию каждого объекта.

Таким образом, память выделяется из кучи в новый указатель. Значению в новой ячейке памяти присваиваются значения из исходного объекта.

Особая благодарность Хансу Пассанту, который посоветовал мне найти ошибку, всегда делая конструктор копирования закрытым.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню