国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

STM_SETIMAGE引起的gdi內(nèi)存泄露

2019-11-14 09:49:26
字體:
供稿:網(wǎng)友

STM_SETIMAGE引起的gdi內(nèi)存泄露

最近給程序加了一個動畫功能后,發(fā)現(xiàn)程序會引起及其嚴(yán)重的內(nèi)存泄露,找了半天發(fā)現(xiàn)是調(diào)用STM_SETIMAGE引起的。素以在此將使用STM_SETIMAGE遇到的問題記錄一下。 我的程序?qū)赢嫷乃袔崆凹虞d后用定時器循環(huán)用STM_SETIMAGE把位圖句柄發(fā)送到窗口顯示,發(fā)現(xiàn)沒顯示一次就泄露好幾M內(nèi)存,而且動畫切換的速度是很快的,所以不一會就開始bad_alloc了。 為什么每發(fā)送一次STM_SETIMAGE就泄露呢?查看msdn關(guān)于STM_SETIMAGE的說明,最后有一段描述,原文不貼了,翻譯過來大概就是這樣: 在xp下(xp以上應(yīng)該也是),如果顯示的位圖有非零的透明通道的像素(我自己翻譯的),控件就會復(fù)制一份位圖,這個復(fù)制的位圖的句柄將在下次調(diào)用STM_SETIMAGE時作為返回值返回,調(diào)用者有責(zé)任釋放這個位圖,不然就會內(nèi)存泄露。 解決方法: 我不知道微軟內(nèi)部用了怎樣的實現(xiàn)才會導(dǎo)致有這樣奇葩的使用方式,而且目前我也不知道怎樣判斷什么叫做“有非零的透明通道的像素”,所以只能通過判斷返回的句柄,如果創(chuàng)建static控件后第一次使用STM_SETIMAGE,會返回NULL,如果內(nèi)部沒有復(fù)制位圖,那么下次調(diào)用STM_SETIMAGE的返回值就是上次傳入的位圖句柄,如果內(nèi)部有復(fù)制位圖,那么下次調(diào)用STM_SETIMAGE的返回值就是static控件內(nèi)部創(chuàng)建的位圖句柄,需要用DeleteObject刪除位圖,釋放內(nèi)存。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 长武县| 时尚| 沐川县| 尉氏县| 乳山市| 维西| 宣化县| 五峰| 蓝田县| 大埔县| 来凤县| 兴义市| 磴口县| 绿春县| 南投县| 屏山县| 临城县| 高清| 漾濞| 洛扎县| 湄潭县| 石景山区| 兴城市| 灌云县| 临沭县| 平乡县| 荆州市| 延边| 伊春市| 孝感市| 易门县| 崇礼县| 嘉义县| 闸北区| 华蓥市| 修水县| 化隆| 文昌市| 靖安县| 安福县| 永嘉县|