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的父对象被销毁时,它才会被自动销毁。