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

delete一个QDialog老是出错,这种错误怎么找源头

3
回复
6289
查看
 关闭 [复制链接]
累计签到:12 天
连续签到:1 天
来源: 2017-10-29 21:53:38 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 ycyu1455 于 2017-10-30 22:47 编辑

#include "choreclock.h"
#include <QDebug>
#include "dialog.h"
#include <QTime>
#include <QTimer>
#include <phonon>
#include <QMessageBox>

ChoreClock::ChoreClock(int iTemp,int iiTemp){
    //qDebug()<<"进入单定时器对象的构造函数";
    c = iTemp;//控制提示正在创建第几个闹钟或定时器的标志
    cc = iiTemp;//控制创建闹钟或定时器的标志

    if(cc == 1)//创建闹钟
    {
        dialogTemp = new Dialog(c,cc);
        dialogTemp->show();

        time = dialogTemp->timeTemp;
        qDebug()<<"choreclock的时间对象地址"<< time;
        timer = new QTimer();
        //qDebug()<< timer->isActive();//测试定时器有没有开启
        connect(timer,SIGNAL(timeout()),this,SLOT(timerupdate()));
        timer->start(1000);
    }
    else if(cc == 2)//创建定时器
    {
        qDebug()<<"定时器";
    }
}

ChoreClock::~ChoreClock(){
    if(cc == 1)//创建闹钟
    {
        delete dialogTemp;//这个释放会导致出错
        delete timer;
        delete time;
    }
    else if(cc == 2)//创建定时器
    {
        qDebug()<<"定时器";
    }
}

void ChoreClock::timerupdate(){
    if(cc == 1)//创建闹钟
    {
    //qDebug()<<QString("进入单定时器对象%1的时间处理函数").arg(c)<<time.toString("hh:mm:ss") ;
        if(time->toString("hh:mm:ss")==QTime::currentTime().toString("hh:mm:ss"))
        {
            qDebug()<<QString("汪汪汪汪 %1 %2").arg(c).arg(time->toString("hh:mm:ss"));
            Phonon::MediaObject *music = Phonon::
            createPlayer(Phonon::VideoCategory,Phonon::MediaSource("D:/Download/KuGou/mysong.mp3"));
            music->setParent(this);
            music->play();
            QTimer::singleShot(12000,music,SLOT(stop()));
            QMessageBox::about(0,"闹钟 汪汪汪汪",QString("%1").arg(time->toString("hh:mm:ss")));
        }
    }
    else if(cc == 2)//创建定时器
    {
        qDebug()<<"定时器";
    }
}

附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册
回复

使用道具 举报

累计签到:12 天
连续签到:1 天
2017-10-30 22:27:38 显示全部楼层
本帖最后由 ycyu1455 于 2017-10-30 22:29 编辑

目前查到2个错误
第一个是牛人  lemonzll 帮忙找到的:这种调试下,定位的是delete time那行出错了,看了下是dialog删除了,删除dialog的时候dialog里面的time也删除了,但是ChoreClock里面的time和dialog里面的time其实是一个,导致ChoreClock析构时删除time就又删了一遍,导致出错了。这种是C++里面很常见的,QTime这种非QObject继承的类你直接用对象就行,不要用指针

第二个是我找到:
Phonon::MediaObject *music = Phonon::createPlayer(Phonon::VideoCategory,Phonon::MediaSource("D:/Download/KuGou/mysong.mp3"));
应该是这行代码也会导致的出错,因为这段代码是快速申请Phonon::MediaObject 堆对象,后来我把Phonon::MediaObject *music 定义在头文件,分别手动在构造函数、或定时器槽函数中new的Phonon::MediaObject对象,发现

在构造函数new的 Phonon::MediaObject对象却没有出错,这时候定时器槽函数 每毫秒都是只在操作唯一的new MediaObject对象

在定时器槽函数new的Phonon::MediaObject对象后 在退出程序时也出现错误,这个定时器槽函数会每秒都创建一个new MediaObject对象,所以退出程序时 就出现了与delete有关的错误
回复

使用道具 举报

累计签到:12 天
连续签到:1 天
2017-10-30 22:29:56 显示全部楼层
这里怎么结贴,还不会
回复

使用道具 举报

尚未签到

2017-11-1 00:21:30 显示全部楼层
无所谓结贴,放着就好
回复

使用道具 举报

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

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