为啥我在这里的析构函数中删除时创建了一个潜在的流浪指针?

Posted

技术标签:

【中文标题】为啥我在这里的析构函数中删除时创建了一个潜在的流浪指针?【英文标题】:Why do I have created a potential stray pointer when having delete in the destructor here?为什么我在这里的析构函数中删除时创建了一个潜在的流浪指针? 【发布时间】: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”会使程序退出正常而不会出现错误或崩溃。在我继续并留下评论之前,我想了解问题所在。

【问题讨论】:

***.com/questions/4172722/what-is-the-rule-of-three 您需要编写防御性代码。将复制构造函数和赋值运算符设为私有,这样您就不会意外复制指针。如果你现在得到一个编译错误,那么你已经找到了原因。 我是否必须通过将其包含在复制构造函数中来对所有涉及的指针进行深层复制? *ptr = 对象.ptr?已经有一段时间了,但我开始记得必须这样做。谢谢 【参考方案1】:

哦,我相信我找到了答案。自从我访问“堆栈”以来已经有一段时间了。我需要创建一个自己的复制构造函数,从而提供每个对象的深层副本。

以这种方式,内存从堆分配给一个新的指针。新内存位置的值被分配来自原始对象的值。

特别感谢 Hans Passant,他建议我通过始终将复制构造函数设为私有来查找错误。

【讨论】:

以上是关于为啥我在这里的析构函数中删除时创建了一个潜在的流浪指针?的主要内容,如果未能解决你的问题,请参考以下文章

如果使用向量删除叠瓦式自己容器的析构函数中的 char* 成员,则崩溃

删除[]的析构函数问题

为啥在调用它的析构函数后我可以访问这个堆栈分配的对象? [复制]

虚析构函数与纯虚函数

为啥我在删除 char* 时出现内存异常

无法在类的析构函数中删除指向数组的成员指针