Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除是如何为QTimer工作的_C++_Qt - Fatal编程技术网

C++ 删除是如何为QTimer工作的

C++ 删除是如何为QTimer工作的,c++,qt,C++,Qt,虽然QTimer继承了QObject,我们不需要手动删除它,但将它放在一个将被多次调用的方法中可以吗 void主窗口::paintEvent(QPaintEvent*event){ //创建一个计时器来更新每一帧 QTimer*定时器=新的QTimer(此); 连接(计时器、信号(超时())、此、插槽(下一帧()); 定时器->启动(); 油漆工(本); 渲染(油漆工、计数器); //如果游戏没有暂停,增加计数器 如果(显示)计数器++; } 使用QTimer::singleShot(100,这

虽然QTimer继承了QObject,我们不需要手动删除它,但将它放在一个将被多次调用的方法中可以吗

void主窗口::paintEvent(QPaintEvent*event){
//创建一个计时器来更新每一帧
QTimer*定时器=新的QTimer(此);
连接(计时器、信号(超时())、此、插槽(下一帧());
定时器->启动();
油漆工(本);
渲染(油漆工、计数器);
//如果游戏没有暂停,增加计数器
如果(显示)计数器++;
}

使用QTimer::singleShot(100,这个,插槽(next_frame());相反。

当QoObject有父对象时会自动删除,但只有在删除父对象时才会删除它们。在您的案例中,您正在制作新的QTimer,并将它们作为挂在其父对象上的一个死重,这本质上是一个内存泄漏,并且由于该对象仍然由其父对象引用,因此一个偷偷的单内存泄漏检查工具甚至无法找到。当您不再使用QObject时,您应该删除它们,但如果您在某个插槽中,或者从他们使用QObject::deleteLater()的对象回调


尽管在这种情况下,正如有人已经说过的,不要使用QTimer对象,而是使用单次计时器,或者QBasicTimer。

这段代码没有意义。10次调用paintEvent,其中10次计时器存在于内存中。10000个对paintEvent的调用,其中10000个计时器存在于内存中。更糟糕的是,由于每个计时器都连接到同一个插槽,N个现有计时器意味着每次超时调用N个下一个\u帧。将计时器设置为MainWindow的子项意味着只有当MainWindow关闭时,计时器才会被销毁。通常,您只会创建此计时器一次,例如作为MainWindow的成员。由于默认值为0,因此在不设置其间隔的情况下启动此计时器也没有意义。