为什么程序会报 double free or corruption?

caiwei_cs 2016-12-15 02:17:39
程序如下:
main:

#include <QCoreApplication>
#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 <QTimer>
#include <QDebug>

cc::cc(QObject *parent) : QObject(parent)
{
this->deleteLater();
qDebug()<<"deletelater called";
}


cc.h
#ifndef CC_H
#define CC_H

#include <QObject>

class cc : public QObject
{
Q_OBJECT
public:
explicit cc(QObject *parent = 0);

signals:

public slots:
};

#endif // CC_H


运行程序会报错:deletelater called
*** Error in `/home/caiwei/tmp/11/build-dd-Qt_5_2_0_X86-Debug/dd': double free or corruption (out): 0x00007fff4779b910 ***
按 <RETURN> 来关闭窗口...

如果使用cc *k = new cc;就不会报错,或者不是在main函数里面使用就不会。
想不通为什么?
...全文
2884 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
namezdd 2016-12-21
  • 打赏
  • 举报
回复
引用 2 楼 caiwei_cs 的回复:
[quote=引用 1 楼 yuyu414 的回复:] 错误提示很明确了啊,析构了两次,第二种局部变量方式,main函数执行完就析构了,然后你类里面又deletelater了一次。 第一种没有手动释放,用deletelater析构了一次
这里main函数不会执行完吧,return a.exec();会进入消息循环,不会结束[/quote] 是在消息循环,但是main里面的局部变量都释放了
孔方发发 2016-12-20
  • 打赏
  • 举报
回复
什么情况,构造函数一开始就删除?
caiwei_cs 2016-12-19
  • 打赏
  • 举报
回复
自己顶一下
caiwei_cs 2016-12-16
  • 打赏
  • 举报
回复
引用 1 楼 yuyu414 的回复:
错误提示很明确了啊,析构了两次,第二种局部变量方式,main函数执行完就析构了,然后你类里面又deletelater了一次。 第一种没有手动释放,用deletelater析构了一次
这里main函数不会执行完吧,return a.exec();会进入消息循环,不会结束
yyxmm 2016-12-15
  • 打赏
  • 举报
回复
错误提示很明确了啊,析构了两次,第二种局部变量方式,main函数执行完就析构了,然后你类里面又deletelater了一次。 第一种没有手动释放,用deletelater析构了一次

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧