标题:delete一个QDialog老是出错,这种错误怎么找源头
作者:ycyu1455
日期:2017-10-29 21:36
内容:
#include "choreclock.h"
#include
#include "dialog.h"
#include
#include
#include
#include
ChoreClock::ChoreClock(int iTemp,int iiTemp){
//qDebug()timeTemp;
qDebug()
#1 [lemonzll 10-29 22:31]
这种调试下,定位的是delete time那行出错了,看了下是dialog删除了,删除dialog的时候dialog里面的time也删除了,但是ChoreClock里面的time和dialog里面的time其实是一个,导致ChoreClock析构时删除time就又删了一遍,导致出错了。这种是C++里面很常见的,QTime这种非QObject继承的类你直接用对象就行,不要用指针
#2 [ycyu1455 10-29 22:50]
谢谢,你是查到这个错误的速度真的好快,不过里面还有个疑问,我把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 [小韩老师 10-29 22:56]
delete time;这个可以删除,是不需要析构的,你不是在这个类中new的。
如果只是析构的问题,建议每次new的时候都指明父对象this,比如new QTimer(this);让你所有的类都继承于QObject,这样Qt自动管理指针的析构,Qt可以自动管理子对象的析构,前提你自己定义的类都继承于QObject,你就不要担心析构了。