【发布时间】:2013-10-12 02:24:39
【问题描述】:
我的程序在退出时崩溃。追溯错误,我找到了 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”会使程序退出正常而不会出现错误或崩溃。在我继续并留下评论之前,我想了解问题所在。
【问题讨论】:
-
您需要编写防御性代码。将复制构造函数和赋值运算符设为私有,这样您就不会意外复制指针。如果你现在得到一个编译错误,那么你已经找到了原因。
-
我是否必须通过将其包含在复制构造函数中来对所有涉及的指针进行深层复制? *ptr = 对象.ptr?已经有一段时间了,但我开始记得必须这样做。谢谢