• 3333阅读
  • 3回复

[提问]delete一个QDialog老是出错,这种错误怎么找源头 [复制链接]

上一主题 下一主题
离线ycyu1455
 

只看楼主 倒序阅读 楼主  发表于: 2017-10-29
#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()<<"定时器";
    }
}

描述:小闹钟
附件: MyAlarmClock.rar (5 K) 下载次数:2
离线lemonzll

只看该作者 1楼 发表于: 2017-10-29
这种调试下,定位的是delete time那行出错了,看了下是dialog删除了,删除dialog的时候dialog里面的time也删除了,但是ChoreClock里面的time和dialog里面的time其实是一个,导致ChoreClock析构时删除time就又删了一遍,导致出错了。这种是C++里面很常见的,QTime这种非QObject继承的类你直接用对象就行,不要用指针
3条评分好评度+1贡献值+1威望+1
ycyu1455 好评度 +1 一针见血 2017-10-29
ycyu1455 贡献值 +1 一针见血 2017-10-29
ycyu1455 威望 +1 一针见血 2017-10-29
离线ycyu1455

只看该作者 2楼 发表于: 2017-10-29
谢谢,你是查到这个错误的速度真的好快,不过里面还有个疑问,我把ChoreClock里面的音频Phonon的代码全部删除,为什么就不会出错了
---------------------------------------------------------------------------------
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有关的错误
离线小韩老师

只看该作者 3楼 发表于: 2017-10-29
delete time;这个可以删除,是不需要析构的,你不是在这个类中new的。
如果只是析构的问题,建议每次new的时候都指明父对象this,比如new QTimer(this);让你所有的类都继承于QObject,这样Qt自动管理指针的析构,Qt可以自动管理子对象的析构,前提你自己定义的类都继承于QObject,你就不要担心析构了。
3条评分好评度+1贡献值+1威望+1
ycyu1455 好评度 +1 - 2017-10-29
ycyu1455 贡献值 +1 - 2017-10-29
ycyu1455 威望 +1 - 2017-10-29
快速回复
限100 字节
 
上一个 下一个