最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談QT內(nèi)存泄漏

 更新時間:2021年09月24日 10:19:01   作者:yhl_sophia  
本文主要介紹了淺談QT內(nèi)存泄漏,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

01前言

   前幾天,項目開展了一次代碼初次評審。會上,領導指出一些可能會帶來內(nèi)存泄漏的代碼,如下圖所示:

圖中的pLayout在new的時候沒有指定任何父對象,且MainWindow的析構函數(shù)中也沒有對pLayout做delete操作,這意味著為pLayout申請的內(nèi)存空間在程序運行期間是一直沒有得到釋放的。實際上,項目代碼中,還有許多這種“隱患”:一個單例類的成員變量在new的時候沒有指定父對象、一個靜態(tài)類的成員在new的時候沒有指定父對象……

這些“隱患”為何在目前程序運行時沒有暴露出問題?基于這個疑惑,我研究了QT的半自動化的內(nèi)存管理,并結合實驗進行結果驗證,現(xiàn)將分析過程記錄下來

02 QT半自動化內(nèi)存管理要點

  • QObject及其派生類的對象,如果其parent非0,那么其parent析構時會析構該對象
  • QWidget及其派生類的對象,可以設置 Qt::WA_DeleteOnClose 標志位(當close時會析構該對象)
  • QAbstractAnimation派生類的對象,可以設置 QAbstractAnimation::DeleteWhenStopped
  • QRunnable::setAutoDelete()、MediaSource::setAutoDelete()
  • 父子關系:父對象、子對象、父子關系。這是Qt中所特有的,與類的繼承關系無關,傳遞參數(shù)與parent有關(基類、派生類,或父類、子類,這是對于派生體系來說的,與parent無關)

03實驗過程詳解

堆空間的內(nèi)存泄漏與改進方法實踐實例

繼承QWidget類的Test類,通過new為其分配內(nèi)存,沒有設置WA_DeleteOnclose屬性且使用完后也沒有delete

實驗結果:關閉testWidget窗口后,沒有調(diào)用其析構函數(shù)打印“test delete”信息。直到程序結束之前testWidget的申請的內(nèi)存空間都未被釋放

改進方法A

為testWidget窗口設置Qt::WA_DeleteOnClose屬性

實驗結果:關閉testWidget窗口后,調(diào)用了其析構函數(shù),內(nèi)存被釋放了

改進方法B

不設置Qt::WA_DeleteOnClose屬性,但是在new完testWidget后,程序退出前調(diào)用testWidget的delete函數(shù)

實驗結果:關閉testWidget窗口后,調(diào)用了其析構函數(shù),內(nèi)存也被釋放了

實驗結論:QWidget及其派生類的對象,可以設置 Qt::WA_DeleteOnClose 標志位(當close時會析構該對象)或者手動delete來釋放內(nèi)存

棧空間的內(nèi)存實踐實例不采用new,為testWidget分配棧空間,不設置Qt::WA_DeleteOnClose屬性,不手動delete

實驗結果:關閉窗口時調(diào)用了testWidget的析構函數(shù),內(nèi)存被釋放了

testWidget不采用new創(chuàng)建,直接將對象建議在??臻g,但設置Qt::WA_DeleteOnClose屬性或者使用后delete &testWidget

實驗結果:程序崩潰了,在第一次嘗試delete testWidget時就出錯

實驗結論:delete棧上分配的地址會出錯

父對象和子對象析構的實踐實例將testWidget的父對象設置為mainwindow

實驗結果:關閉窗口后,正常打印析構信息。程序退出前,先釋放testWidget的空間,再釋放mainwindow的空間(兩者都是分配到??臻g)

調(diào)整mainwindow和testWidget的構造順序

實驗結果:程序崩潰

分析原因:mainwindow析構時會將其子對象testWidget也析構,但testWidget是分配到棧空間上的,delete棧上的空間會出錯。

將testWidget分配到堆上,指定父對象為mainwindow,并在程序退出前delete mainwindow

實驗結果:delete mainwindow時,會將testWidget也一并delete

將testWidget作為mainwindow的成員,但在構造時不指定父對象,在main函數(shù)中delete mainwindow

實驗結果:應用程序退出前只有mainwindow被析構了

實驗結論:

  • 析構函數(shù)總是出現(xiàn)在對象的生命期結束之時,靜態(tài)對象在程序運行結束之時析構。
  • 對象的構造和析構的關系是棧數(shù)據(jù)結構中的入棧和出棧的關系。
  • 指定了父對象的子對象,在父對象被析構時,會將其一并析構掉

Malloc分配的內(nèi)存空間實踐實例

新建一個malloc_class,將malloc_class作為mainwindow的成員,在mallocClass的構造函數(shù)里面用malloc申請500M內(nèi)存,在mainwindow放置一個button,點擊button就delete malloc_class,在任務管理器中看500M內(nèi)存是否有被釋放。對于malloc_class的new操作,測試了兩種情況:

new malloc_class時不指定父對象new malloc_class時指定它的父對象為mainwindow

實驗結果:兩種情況一樣的結果,點擊button,在delete testWidget后,在testThread中申請的500M空間都沒有被釋放

猜想是不是因為malloc的空間并沒有指定父對象,異想天開的又測試了另外一種情況:直接創(chuàng)建malloc_class時用malloc為其分配內(nèi)存,再在button的槽函數(shù)里delete malloc_class

實驗結果:程序崩潰了……

查閱資料得知:malloc只能為POD類型數(shù)據(jù)(一個類或結構體通過二進制拷貝后還能保持數(shù)據(jù)不變,具體解釋自查資料)分配內(nèi)存,其他的必須用new分配內(nèi)存。Malloc函數(shù)分配內(nèi)存空間時并不調(diào)用構造函數(shù),同樣free函數(shù)再回收空間時也不調(diào)用析構函數(shù)。

實驗結論:malloc分配的內(nèi)存空間都要自己管理,與QT的父子對象同步析構沒有關系。也就是說應該再次明確:指定父對象的并且基于QObject為基類的對象才會同步析構

注意:malloc的空間只是一個虛擬內(nèi)存,一定要初始化或者寫數(shù)據(jù)才會有物理內(nèi)存的體現(xiàn)

04總結

對于在應用程序中不是常駐的對象,應習慣為其指定父對象,或著用完之后手動delete;對于應用程序中常駐的對象,即便在應用程序結束后操作系統(tǒng)會釋放其使用的內(nèi)存,也不建議隨性new沒有parent的對象??傊?,養(yǎng)成嚴格處理內(nèi)存分配和釋放內(nèi)存的好習慣,要清楚自己在編碼時使用了哪些內(nèi)存,什么時候需要釋放,不定時關注程序的內(nèi)存占用率。

到此這篇關于淺談QT內(nèi)存泄漏的文章就介紹到這了,更多相關QT內(nèi)存泄漏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別

    C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別

    本文主要介紹了C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Linux下C語言修改進程名稱的方法

    Linux下C語言修改進程名稱的方法

    這篇文章主要介紹了Linux下C語言修改進程名稱的方法,涉及Linux下使用C語言操作進程的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Qt實現(xiàn)簡易計時器的示例代碼

    Qt實現(xiàn)簡易計時器的示例代碼

    計時器實現(xiàn)四個功能:開始計時、停止計時、暫停計時以及打點。當點擊暫停時,開始按鈕和停止按鈕無法點擊。當點擊停止時,開始按鈕和暫停按鈕無法點擊,此時停止按鈕變?yōu)榍辶?。本文將用Qt實現(xiàn)這樣的一個計時器,需要的可以參考一下
    2022-06-06
  • C++實現(xiàn)LeetCode(90.子集合之二)

    C++實現(xiàn)LeetCode(90.子集合之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(90.子集合之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c語言 sscanf,scanf,fscanf正則表達式用法

    c語言 sscanf,scanf,fscanf正則表達式用法

    每種語言都對正則表達式有著不同程度的支持,在C語言中,有輸入功能的這三個函數(shù)對正則表達式的支持并不強大,但是我們還是有必要了解一下
    2018-04-04
  • VS2022永久配置OpenCV開發(fā)環(huán)境的實現(xiàn)

    VS2022永久配置OpenCV開發(fā)環(huán)境的實現(xiàn)

    本文主要介紹了VS2022永久配置OpenCV開發(fā)環(huán)境的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++ 輸入scanf()和輸出printf()的操作

    C++ 輸入scanf()和輸出printf()的操作

    這篇文章主要介紹了C++ 輸入scanf()和輸出printf()的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C/C++中文件的隨機讀寫詳解及其作用介紹

    C/C++中文件的隨機讀寫詳解及其作用介紹

    這篇文章主要介紹了C/C++中文件的隨機讀寫詳解及其作用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 對C語言中sizeof細節(jié)的三點分析介紹

    對C語言中sizeof細節(jié)的三點分析介紹

    以下是對C語言中sizeof的細節(jié)進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C++ Sort函數(shù)使用場景分析

    C++ Sort函數(shù)使用場景分析

    sort函數(shù)是algorithm庫下的一個函數(shù),sort函數(shù)是不穩(wěn)定的,即大小相同的元素在排序后相對順序可能發(fā)生改變,如果某些場景需要保持相同元素間的相對順序,可使用stable_sort函數(shù),接下來通過本文給大家介紹C++ Sort函數(shù)詳解,感興趣的朋友一起看看吧
    2025-04-04

最新評論

余江县| 资源县| 伊通| 阜阳市| 蓝山县| 巩义市| 永城市| 黄石市| 宁海县| 祥云县| 延寿县| 马关县| 日照市| 珲春市| 晋城| 双峰县| 邓州市| 文昌市| 海宁市| 望城县| 乌鲁木齐县| 广宗县| 大洼县| 长宁县| 淳化县| 峡江县| 桐柏县| 高青县| 建宁县| 同心县| 微山县| 江山市| 舞阳县| 胶南市| 南康市| 黑河市| 紫金县| 昌平区| 梁河县| 利川市| 开江县|