2013-04-15 27 views
1

我的程序似乎没有泄漏,所以我对此很好奇。如果我已经使用new初始化了一个子类QObject,并且我没有给该对象一个父对象,那么它何时被销毁?这似乎违背了C++的规范,但也许有可能qt元编译器正在幕后做一些事情。何时被动态分配的QObjects被释放

更具体地说,我正在使用QThread,并且在没有父对象的情况下使用moveToThread(线程的影响力没有父母)。当主程序结束时,看起来线程下的对象会被销毁。

回答

1

在没有生命周期管理的情况下动态分配数据将“存活”直到应用程序终止。

如果您担心您的工作对象发生泄漏,您可以在他们的工作完成后致电deleteLater(),并且由于它是一个插槽,您还可以将信号连接到它。

+0

那么这意味着只要我的应用程序执行完毕,无论如何都将释放与它动态分配数据的数据? – edaniels

+1

是的,它并不总是这样,但现代操作系统会清除所有内存,由进程在终止后分配。这并不意味着你应该感到鼓励内存泄漏。但是你总是至少有一个没有父对象的对象 - 根。只要确保考虑到没有父母的对象的生命周期管理。 – dtech

+0

线程无关紧要,重要的是进程,单个进程可以产生许多线程。无论哪个线程拥有它们,当进程终止时,所有动态分配的数据都将被删除。为了能够告诉更多人,你必须看看你的来源,看看你在做什么。 – dtech

1

好吧,我会以不同的方式回答。你不应该认为Qt是一个改变你一般C++设计概念的魔法工具。事实上,它可以关注QObject的任何其他QObject的子代,并且它们的实时时间仅限于父代的实时时间。但总的来说,开发人员需要决定什么时候创建C++对象,然后死掉。这实际上是不好的实践,以转发所有QObject会在应用程序退出时死亡的事实。包含大量QObject的复杂应用程序可能会在安装了一定数量的QObject之后受到严重的性能影响。

回答你的问题,任何现代操作系统将尽快放弃特定进程的所有分配区域..但在应用程序中有你不控制你创建的对象的路径,无论如何都会导致你陷入麻烦。

相关问题