Qt指针释放问题-QTimer

Qt指针释放问题-QTimer

问题描述:

下面这个构造函数执行完,QTimer会自动释放吗?


CDisapperWgt::CDisapperWgt()
{
QTimer* burnTime = new QTimer(this);
    burnTime->start(300);
    burnTime->setSingleShot(true);
    connect(burnTime, &QTimer::timeout, this,
        [this]() {
            setWindowOpacity(0.8);
            QTimer* hideTime = new QTimer(this);
            hideTime->start(1200);
            hideTime->setSingleShot(true);
            connect(hideTime, &QTimer::timeout, this,
                [this]() {
                    close();
                }
            );
        });
}

任何new出来的东西都必须手动释放。不然会导致内存泄露问题。

因为你在槽函数中调用了close()函数,所以,只能在类的析构函数中手动释放,释放前需要先把QTimer停止。但是你这个QTime是一个临时变量,构造函数结束后,burnTime 这个变量就被系统回收了,你都没法再去释放这块内存了。所以,你这个代码百分比会造成内存泄露。
修改方法是,把burnTime 声明成类的成员变量。然后在析构函数中释放内存。

代码如下:

CDisapperWgt::~CDisapperWgt()
{
    if(burnTime)
    {
        if(burnTime->isActive()) //如果仍然活跃
            burnTime->stop(); //停止计时器
        delete burnTime;
        burnTime =0;
    }
}

new必须有对应的delete才会释放,记住
函数结束只会自动释放普通变量
如果不进行delete,那么只有程序结束后才会释放

当QTimer的父对象被销毁时,它才会被自动销毁。