關(guān)于Qt/C++內(nèi)存管理機(jī)制
C++內(nèi)存管理相較于有自動垃圾回收系統(tǒng)(GCC)的語言相對需要注意的細(xì)節(jié)更多。本文謹(jǐn)記錄Qt學(xué)習(xí)中遇到關(guān)于內(nèi)存管理的雜項(xiàng),以更加清楚的認(rèn)識Qt/C++的內(nèi)存管理,也作未來的參考和學(xué)習(xí)過程中加深印象之用。
Qt中對象主要分為兩類,QObject或其派生類對象,普通C++類對象
后者內(nèi)存分配同C++原則。
前者通常有一個parent父對象指針。此非指針非Null時(shí)可將本對象加入父對象樹中。此時(shí)父對象被析構(gòu)時(shí)所有子對象也將自動析構(gòu)。Null時(shí) 代表此對象無父對象,即Qt將無法自動析構(gòu)此對象。
在局部作用域,如函數(shù)內(nèi)部創(chuàng)建的對象如未顯示調(diào)用new將在stack上分配內(nèi)存,而在全局范圍聲明的對象將在heap上分配內(nèi)存,因?yàn)镼t的parent特性,即使在heap上分配內(nèi)存也無需擔(dān)心內(nèi)存泄漏??偟膩碚f,關(guān)于是在堆上還是在棧上創(chuàng)建對象,依賴于這個對象所需要的生命周期,與其它無關(guān)。
?
需要注意的細(xì)節(jié);
1、對象只需要在局部作用域(stack)存在時(shí)可以選擇不進(jìn)行內(nèi)存分配,利用局部作用域變量的生命周期自動清理資源。
2、對于在局部作用域上創(chuàng)建的父對象及其子對象,要注意對象銷毀的順序,因?yàn)楦笇ο箐N毀時(shí)也會銷毀子對象,當(dāng)子對象會在父對象之后被銷毀時(shí)會引發(fā)二次析構(gòu)。
3、以往編碼時(shí)常省略new QWidget對象時(shí)的參數(shù)如(this),這樣將導(dǎo)致子對象的父對象被設(shè)置為Null,導(dǎo)致父對象析構(gòu)時(shí)子對象未能自動析構(gòu),這樣會出現(xiàn)程序運(yùn)行時(shí)的內(nèi)存泄漏。