首页| 论坛| 消息

标题:为什么程序会报 double free or corruption?
作者:caiwei_cs
日期:2016-12-16 10:56
内容:

程序如下:
main:#include
#include "cc.h"

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

//cc *k = new cc;//不会报错

cc k;//会报错

return a.exec();
}
cc.cpp
#include "cc.h"
#include
#include

cc::cc(QObject *parent) : QObject(parent)
{
this->deleteLater();
qDebug()


#1 [flfw1314 12-16 12:39]
return a.exec不会退出的话那就出大事了,他不退出怎么结束应用程序?其实在windows下,当程序收到quit消息时,主消息循环就会退出。就是你的a.exec就返回了。main返回之后的事就交给crt运行时库了,他要做的事其中之一就是对象的释放,就是你的cc对象k会释放,之后调用你的cc析构函数。之于你说的cc *k = new cc不会出错,而cc k会出错。这是c++里内存分布的原因。前者是在堆里面分配空间,需要自己释放;后者是在栈里面分配内存,有系统自己释放。so,new cc 你不显示调用delete 他是不会释放的,也就不会调用析构函数。而 cc k会在该变量的生存期结束之后自动释放。调用其析构函数。看着很简单的问题,其实涉及的细节很多。说了个大概。有问题再交流
#2 [uidab 12-16 15:34]
以前看得一个介绍内存泄露的文章,代码和你写的一样一样的。
附上链接
http://blog.csdn.net/taiyang1987912/article/details/29271549
#3 回 flfw1314 的帖子 [caiwei_cs 12-16 16:21]
flfw1314:return a.exec不会退出的话那就出大事了,他不退出怎么结束应用程序?其实在windows下,当程序收到quit消息时,主消息循环就会退出。就是你的a.exec就返回了。main返回之后的事就交给crt运行时库了,他要做的事其中之一就是对象的释放,就是你的cc对象k会释放,之后调用你的cc析构 .. (2016-12-16 12:39) 
我的意思是我不知道为什么这种情况 return a.exec()会退出。难道我销毁一个控件,消息循环就退出,结束程序,显然没有直接关系。
#4 [flfw1314 12-16 16:36]
你程序退出的时候就是a.exec返回的时候,你这个报错是关闭程序的时候报的吧
#5 [xzfn 12-17 15:25]
等同于
int ret = a.exec();
return ret;
a.exec()虽然只有一句,里面确实整个消息循环所在。
单击x的时候,a.exec()会返回。
退出main时,deleteLater和out of scope都会调析构,两次。

<< 1 2 >> (1/2)

回复 发表
主题 版块