C語音使用庫時發(fā)生內(nèi)存泄漏
現(xiàn)象以及解決辦法:
現(xiàn)象:使用libpng庫時,內(nèi)存一直增加。
在做一個打字練習軟件時,需要讀取很多圖片。
每次按鍵,刷新一次界面,讀取一次圖片。
刷新一定次數(shù)界面后,程序就因為內(nèi)存不足自動退出了。
經(jīng)過調(diào)試,發(fā)現(xiàn)每次按鍵,內(nèi)存消耗都在增加。
也就是說,按鍵次數(shù)越多,內(nèi)存消耗越多。
問題就出在這里。
正確的內(nèi)存消耗:按鍵那一下增加,然后就減少了。
但是我們的程序只有增加,沒有減少。
所以猜測:我們的程序缺少內(nèi)存釋放的代碼。
在添加了68至81行的代碼后,內(nèi)存消耗就正常了。

增加的這些代碼,正是內(nèi)存釋放的代碼;
png_free_data 釋放了讀取png文件所得到的圖像數(shù)據(jù)。
png_destroy_read_struct釋放了讀取png文件時所用的結(jié)構(gòu)體。
fclose釋放了讀取文件所使用的文件結(jié)構(gòu)信息。
內(nèi)存泄漏:
內(nèi)存泄漏:程序員不能繼續(xù)掌控的內(nèi)存,就是泄漏掉的內(nèi)存。png庫使用一些內(nèi)存時,會找一下些被標記為”空閑”的內(nèi)存,然后通過操作系統(tǒng)給這些內(nèi)存打上“忙”標記。如果后續(xù)多次使用png庫函數(shù)讀圖片,同時在使用完后,不給使用過的內(nèi)存打上“空閑”標記,就會造成”忙”的內(nèi)存越來越多。從而在使用N此png庫函數(shù)后,造成所有內(nèi)存都“忙”.
所以,要及時的給使用過的內(nèi)存,打上“空閑”標記。
注意到,給內(nèi)存打“空閑“標記,就需要知道內(nèi)存地址。但是我們多次使用png庫函數(shù)時,通常使用同樣的變量來知道內(nèi)存地址,比如png_read。多次使用png庫函數(shù)會造成png_read會被覆蓋。因此必須再下一次使用庫函數(shù)前,及時的將png_read對應(yīng)的內(nèi)存標記為”空閑”。
如果,我們給一些內(nèi)存打上了”忙“標簽,后來我們又弄丟了這些內(nèi)存的地址,那么程序員就無法再給這些內(nèi)存打上”空閑”的標簽了,也就無法再使用這些內(nèi)存了。
png庫的資料:
一般系統(tǒng)上應(yīng)該自動安裝了pnglib庫。
要使用此庫,程序員直接使用png.h 和png.lib 即可。
例子程序:
如果需要第一手的例程,可以去其源碼包中找,下載地址:https://sourceforge.net/projects/libpng/
操作文檔可以在這個網(wǎng)頁中找:http://www.libpng.org/pub/png/libpng.html。、
源碼中解壓后為文件夾lpng1640
lpng1640/contrib/examples/pngpixel.c 讀取像素值的例子
lpng1640/contrib/examples/pngtopng.c 讀取png圖片,并將其存儲為新的png圖片