c++析构函数错误



我写了一个不能正常工作的程序。问题是,当我销毁指针时,它就完全出错了。

代码如下:

if(pImage)
    delete pImage;

但是如果我使用这段代码,它可以正常工作。

    if(!pImage)
    delete pImage;

你能解释一下原因吗?

第二个例子肯定不会正确工作-至少不是你想要的正确形式。
如果pImage为任何非零值,则不会执行delete语句。它可能编译和工作良好,但您正在泄漏内存(可能还有其他资源)。您的问题很可能是双重删除,即删除指针两次。

因为你没有改变pImage。这就是为什么。

pImage仍然指向某个地方,但是现在它指向的内存已经被破坏了。

第一个版本如果(pImage)删除pImage;

检查指针是否在那里。正如你所声明的那样,它会工作得很好。当你声明它时,你应该将它设置为NULL,即pImage = NULL;所以如果指针没有指向任何东西,这一行就会跳过。如果分配了一些东西,上面的行将(if语句变为true)释放给它的内存。请记住,pImage需要是动态分配的内存,并且在删除后,它不应该被访问,否则会再次产生错误。

你的第二个版本如果(! pImage)删除pImage

逻辑上是错误的。这意味着如果pImage不存在,删除它,那么这个IF语句变为false。通过良好的实践,如果你让指针NULL,它会给你一个错误,因为它在逻辑上是错误的。如果pImage不存在,请删除它!!!!!!!因此,当该行被分配内存时,它可能会跳过。

(真正的问题是你应该总是设置指针指向NULL时声明它。你做到了,你就可以走了。

如果您使用new为pImage分配内存,则delete可能有效;但是,如果您使用malloc()分配了内存,或者如果指针指向另一个未使用new分配的内存,那么在调用delete时您就会遇到麻烦。

最新更新