问题描述
- C语言内存释放与调用子函数时间变长
-
各位大神,你们好:
小弟最近用C语言编程遇到这样一个问题(代码比较多,就不粘了,见谅):
在子函数A中用malloc申请内存,在调用函数A的B函数中释放申请的内存。重复运行100次函数B,发现:在函数B中若不释放A的申请的内存,每次A运行的时间基本一样,而内存占用量持续上升;若在函数B中释放A申请的内存,占用内存问题解决了,然后每次调用A的时间又持续上升。
完全没有搞明白这是个什么情况,你们怎么看?
解决方案
堆上的内存申请和释放一定要一一对应,用完就需要释放,不然那块空间就一直被占用着无法再次利用,时间上升的问题可能是你重复申请释放,使得堆内存碎片过于零碎,堆内存管理器内部有个数据结构保存着各块可使用内存空间的大小,每次申请堆内存,内部都会根据你要申请的大小去给你分配空间,如果堆内存过于零碎,就有可能造成分配时间的延长,如果是项目中实际需要频繁的调用和释放堆内存,建议自己建立一个堆内存池进行利用(也就是你自己先预先申请一块足够大的堆内存空间,内部管理这块空间的使用)。
解决方案二:
如果你每次用的内存一样,或者你可以得到一个使用内存的最大值,你可以一次性分配,放在全局变量中。而不是每次都分配/回收,这样可以解决内存泄漏的问题,也避免浪费性能。
解决方案三:
很可能就是你增加了释放内存的操作导致时间变长
解决方案四:
转自度娘:。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针。
具体的内部机制我也不太确定,可以试试不同大小的空间申请/释放看看。比如你释放的都是16byte的大小,然后去申请8byte的大小,是否时间不会增加?
解决方案五:
简单点说就是有malloc后面一定要配对free,不然就会有问题内存泄露
解决方案六:
malloc是分配在堆上的内存 你不用了就一定要free 不然就会要内存泄漏 这两个一定要对应上
时间: 2024-10-29 03:15:13