欢迎光临散文网 会员登陆 & 注册

C语音使用库时发生内存泄漏

2023-08-23 17:17 作者:老师明明可以靠颜值  | 我要投稿

现象以及解决办法:

现象:使用libpng库时,内存一直增加。

在做一个打字练习软件时,需要读取很多图片。

每次按键,刷新一次界面,读取一次图片。

刷新一定次数界面后,程序就因为内存不足自动退出了。

经过调试,发现每次按键,内存消耗都在增加。

也就是说,按键次数越多,内存消耗越多。

问题就出在这里。

正确的内存消耗:按键那一下增加,然后就减少了。

但是我们的程序只有增加,没有减少。

所以猜测:我们的程序缺少内存释放的代码。

在添加了68至81行的代码后,内存消耗就正常了。

增加的这些代码,正是内存释放的代码;

png_free_data 释放了读取png文件所得到的图像数据。

png_destroy_read_struct释放了读取png文件时所用的结构体。

fclose释放了读取文件所使用的文件结构信息。

内存泄漏:

内存泄漏:程序员不能继续掌控的内存,就是泄漏掉的内存。png库使用一些内存时,会找一下些被标记为”空闲”的内存,然后通过操作系统给这些内存打上“忙”标记。如果后续多次使用png库函数读图片,同时在使用完后,不给使用过的内存打上“空闲”标记,就会造成”忙”的内存越来越多。从而在使用N此png库函数后,造成所有内存都“忙”.


所以,要及时的给使用过的内存,打上“空闲”标记。

注意到,给内存打“空闲“标记,就需要知道内存地址。但是我们多次使用png库函数时,通常使用同样的变量来知道内存地址,比如png_read。多次使用png库函数会造成png_read会被覆盖。因此必须再下一次使用库函数前,及时的将png_read对应的内存标记为”空闲”。

如果,我们给一些内存打上了”忙“标签,后来我们又弄丢了这些内存的地址,那么程序员就无法再给这些内存打上”空闲”的标签了,也就无法再使用这些内存了。


png库的资料:

一般系统上应该自动安装了pnglib库。

要使用此库,程序员直接使用png.h 和png.lib 即可。

例子程序:

如果需要第一手的例程,可以去其源码包中找,下载地址:https://sourceforge.net/projects/libpng/

操作文档可以在这个网页中找:http://www.libpng.org/pub/png/libpng.html。、

源码中解压后为文件夹lpng1640

lpng1640/contrib/examples/pngpixel.c 读取像素值的例子

lpng1640/contrib/examples/pngtopng.c 读取png图片,并将其存储为新的png图片


C语音使用库时发生内存泄漏的评论 (共 条)

分享到微博请遵守国家法律