STM SETIMAGE引起的gdi記憶體洩露

2021-07-26 13:56:57 字數 844 閱讀 6542

最近給程式加了乙個動畫功能後,發現程式會引起及其嚴重的記憶體洩露,找了半天發現是呼叫stm_setimage引起的。素以在此將使用stm_setimage遇到的問題記錄一下。

我的程式將動畫的所有幀提前載入後用定時器迴圈用stm_setimage把點陣圖控制代碼傳送到視窗顯示,發現沒顯示一次就洩露好幾m記憶體,而且動畫切換的速度是很快的,所以不一會就開始bad_alloc了。

為什麼每傳送一次stm_setimage就洩露呢?檢視msdn關於stm_setimage的說明,最後有一段描述,原文不貼了,翻譯過來大概就是這樣:

在xp下(xp以上應該也是),如果顯示的點陣圖有非零的透明通道的畫素(我自己翻譯的),控制項就會複製乙份位圖,這個複製的點陣圖的控制代碼將在下次呼叫stm_setimage時作為返回值返回,呼叫者有責任釋放這個位圖,不然就會記憶體洩露。

解決方法:

我不知道微軟內部用了怎樣的實現才會導致有這樣奇葩的使用方式,而且目前我也不知道怎樣判斷什麼叫做「有非零的透明通道的畫素」,所以只能通過判斷返回的控制代碼,如果建立static控制項後第一次使用stm_setimage,會返回null,如果內部沒有複製位圖,那麼下次呼叫stm_setimage的返回值就是上次傳入的點陣圖控制代碼,如果內部有複製位圖,那麼下次呼叫stm_setimage的返回值就是static控制項內部建立的點陣圖控制代碼,需要用deleteobject刪除位圖,釋放記憶體。

Apache日誌檔案超過2G引起系統緩慢

apache 日誌中access log 檔案已達到 2g後,會在 error log 中出現以下錯誤提示,此時客戶訪問web頁變得緩慢。清除access log檔案,並重啟apache後系統正常。tue mar9 14 49 00 2010 notice child pid 16863 exit ...

牛客 小G的約數引起的對於 整數分塊 學習

整除分塊是個啥 要求 n 的值,這時候暴力需要o n 的時間。由於這個區間是連續的,且 是向下取整,當i不能整除k時,n i會等於最小的i 也就是區間最左邊的值 l 除n的商。此時如果可以很快的找到這乙個區間,那麼就可以將時間複雜度降到 o sqrt 接下來講一下怎麼去找這個區間 假設n 20,然後...

引起的故障

linux 中的!可以快速執行history中的歷史命令,很多時候確實是很便利。昨天因為!引起了一次線上環境的關機,因此我們禁止使用!history 1001 22 30 00 2016 12 30 shutdown h now 1002 00 01 25 2017 01 12 su mysql 如...