总结Qt中三大机制(二):内存管理机制

这篇文章继续来总结关于内存管理的内容。

2.内存管理机制

我们知道C++中并没有什么内存管理机制。对于栈上对象我们无需关心,因为它的空间由系统负责,而堆上对象必须由程序猿负责空间的申请与释放。Qt作为第三方类库,给出了一套很好的内存管理机制。

首先需要明确一个概念,Qt作为一套GUI(图形用户界面)类库,在开发时,我们应用最多的就是各类窗口,其中经常用到父子窗口。必须明确,父子窗口一种窗口之间的组合关系,而不是继承中的父子类关系,两者绝没有任何关系。

Qt中的内存管理:子窗口可以通过指定父窗口的方式,来托管子窗口的内存,而父窗口又可以通过它的父窗口来托管自己的内存,一层一层,顶级窗口(QWidget类对象或者其派生类widgwt对象)一般在main函数中实例化为可以自动销毁空间的栈上对象,这样子窗口的空间就只需手动申请而不用管释放了。其中的底层实现大概是这样:当父窗口释放时,会在析构函数中遍历自己所有的子窗口,将它们释放。

所有的QObject类对象及其派生类对象都可以通过指定父对象来托管内存,QWidget继承自QObject,所以它及其派生类对象能够使用内管管理机制。

那么所有的子对象只能在父对象销毁的时候才能一起销毁,势必会造成内存驻留,能不能自己来销毁呢?当然开发者也可以使用delete来销毁子对象,但是不推荐这种用法,因为QObject对象远比普通的类对象复杂的多,QObject底层实现在我们不知道的情况下,正进行着一些工作。如果这个时候使用delete强制释放,会造成一些不可预知的错误。一般推荐使用deleteLater函数,进行子对象的安全释放,它会等待所有事情都处理完毕后才释放。

[slot] void QObject::deleteLater();

相对来说,内存管理机制是比较简单的一个知识点,在实际开发中也给我们带来了极大的方便。

发布了34 篇原创文章 · 获赞 22 · 访问量 7197

猜你喜欢

转载自blog.csdn.net/lizun7852/article/details/88740970