找回密码
 立即注册
收起左侧

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

3
回复
9854
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2016-12-16 11:06:27 显示全部楼层 |阅读模式
5Qter豆
本帖最后由 caiwei_cs 于 2016-12-16 11:09 编辑

程序如下:
main:
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
#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
C/C++ code?
1
2
3
4
5
6
7
8
9
#include "cc.h"
#include <QTimer>
#include <QDebug>

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





cc.h
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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函数里面使用就不会。
想不通为什么?         

有人说,是main函数结束会析构一次,我自己deletelater一次,所以会有多重释放。但是我的理解是,return a.exec();是不会退出的。求助。   

最佳答案

查看完整内容

因为cc K等价于cc *K = new cc; delete K; 而不是单纯等价于cc *K = new cc;
回复

使用道具 举报

累计签到:104 天
连续签到:1 天
2016-12-16 11:06:28 显示全部楼层
因为cc K等价于cc *K = new cc;  delete K;
而不是单纯等价于cc *K = new cc;
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-12-17 17:17:38 显示全部楼层
你点击关闭窗口,这时候 a.exec()返回值是0,就直接退出了,局部变量需要析构,我这么理解的,可能不对哈
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2016-12-19 10:36:00 显示全部楼层
没有点击关闭,直接崩溃
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了