最近給程式加了乙個動畫功能後,發現程式會引起及其嚴重的記憶體洩露,找了半天發現是呼叫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 如...