QT中关于QObject类型的指针删除

今天调试了好久关于内存泄漏的问题,之前在测试程序功能性的问题的时候,还没有考虑到这方面的问题,随着功能的完善,整体的程序框架也基本定了下来。但恼人的就是内存管理问题了。

因为程序里不可避免的用到了指针,而且,指针数据的数量还可能是随时变化的。在之前没有考虑内存泄漏的时候,一般我都是直接将目标指针赋值为nullptr即可。但实际的指针地址并未在程序中删除。地址还是会被程序所占用。

首先我尝试了delete的方式,不知道什么情况,在之前第一次使用delete的时候,程序可以跑很久的时间,完全没有任何报错和问题。但后面就出现了问题,可能是引用到了被销毁的指针,也可能是其他问题,但左右就是无法查到具体是哪里的问题,编译器只报错:ASSERT: “&other != this” in file ..\..\include/QtCore/../../src/corelib/tools/qstring.h, line 958。看起来好像是跟QString有关的错误,但是我的指针并没有用到和QString有关的啊。而且上网搜了一下,也没有搜到有效的结果。查询、调试了几个小时都没有有效手段来解决这个问题。

再后来,尝试了用过free的方式来释放内存空间,并将原指针赋值为nullptr来避免成为野指针,但依然没有任何效果。好像free语句完全没有用一样。

后来,发现我需要销毁的指针,在其子函数有一个deleteLater的函数,果断搜一下并试一下效果,发现就是释放与删除指针的空间。鼠标悬浮在deleteLater函数上,可以看到该指针类型为QObject的子类。

然后想到之前调试几小时,发现出错并不是在函数内,而是函数执行完毕后,回到UI主界面响应的时候出错的。而且这个出错还有一定的机率,可能第一次没有出错,第二次就出错了,也可能第十次才出错,但大部分都是第一次执行就出错了。而且UI主界面也是基于QObject类的指针,那么我在用delete来删其他的QObject类的指针的时候,QT在其内部操作我就不得而知了。但目前来说,算是知道了如果遇到基于QObject类的QT自己的类型,那么释放的时候便用 deleteLater 就可以了,毕竟这个函数就是QT为该类型提供的内存释放。

至于其他的,我试了下QString,由于不是基于QObject类,其子函数并没有 deleteLater 函数来释放内存空间。这类的变量应该可以正常通过delete来释放了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注