在linux下QImage和QPixmap的內存泄漏和QPixmap線程安全問題


為什么不在線程里面使用QPixmap(path),而是使用QPixmap::fromImage(QImage(path))或者類似的轉換

這是由於QPixmap構建存在線程安全問題,我們相冊和看圖類的軟件往往使用后台線程加載圖片,而這個時候如果QPixmap(path)構建,在兩個線程同時運行時,經常會出現崩潰的情況,所以QPixmap本身是存在線程安全問題的,所以我們不要在主線程以外的線程直接構建QPixmap,可以通過構建QImage轉化為QPixmap來防止線程安全問題.QImage就不存在這個問題.

QPixmap和QImage在線程中都存在內存泄漏問題

在一個線程中構建了QPixmap或者QImage的對象或者指針,線程退出釋放后,內存並沒有得到釋放,猜測是由於qt對圖像緩存機制的問題.
我們設置最大線程池個數為3-10,得到的結果就是線程池最大數量越大,內存占用的越多,目前也並沒有解決方法.

能釋放大部分內存的方法

#include <malloc.h>
malloc_trim(0);
對空閑的堆空間進行釋放,該函數能釋放沒有使用到的內存,效果顯著,非常好用.
但是依然有部分內存沒有被釋放.

平台和版本

系統:UOSV20(LINUX) ,qt5.11.3

解決方案:

在main函數加上
#include <malloc.h>

main函數第一行加上
mallopt(M_ARENA_MAX,1);

在每一次清理空間的時候家還是那個malloc_trim(0);

linux的回收機制和空間分配機制並不友好,沒有windows那么強大,所以見效分配堆塊空間的分配,是一個不錯的解決方案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM