Моя программа вылетает при выходе. Отслеживая ошибку, я пришел к деструктору класса 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", программа выходит из строя без ошибок или сбоев. Прежде чем продолжить и оставить комментарий, мне нравится понимать, в чем проблема.
О, я считаю, что нашел ответ. Прошло некоторое время с тех пор, как я посетил "стек". Мне нужно создать собственный конструктор копирования и, таким образом, предоставить глубокую копию каждого объекта.
Таким образом, память выделяется из кучи в новый указатель. Значению в новой ячейке памяти присваиваются значения из исходного объекта.
Особая благодарность Хансу Пассанту, который посоветовал мне найти ошибку, всегда делая конструктор копирования закрытым.