C语言内存释放与调用子函数时间变长

各位大神,你们好:
小弟最近用C语言编程遇到这样一个问题(代码比较多,就不粘了,见谅):
在子函数A中用malloc申请内存,在调用函数A的B函数中释放申请的内存。重复运行100次函数B,发现:在函数B中若不释放A的申请的内存,每次A运行的时间基本一样,而内存占用量持续上升;若在函数B中释放A申请的内存,占用内存问题解决了,然后每次调用A的时间又持续上升。
完全没有搞明白这是个什么情况,你们怎么看?

6个回答

堆上的内存申请和释放一定要一一对应,用完就需要释放,不然那块空间就一直被占用着无法再次利用,时间上升的问题可能是你重复申请释放,使得堆内存碎片过于零碎,堆内存管理器内部有个数据结构保存着各块可使用内存空间的大小,每次申请堆内存,内部都会根据你要申请的大小去给你分配空间,如果堆内存过于零碎,就有可能造成分配时间的延长,如果是项目中实际需要频繁的调用和释放堆内存,建议自己建立一个堆内存池进行利用(也就是你自己先预先申请一块足够大的堆内存空间,内部管理这块空间的使用)。

Lmikic
Lmikic 谢谢你的回复。内存池这个想法非常好,我试试看。再次感谢
接近 4 年之前 回复

malloc是分配在堆上的内存 你不用了就一定要free 不然就会要内存泄漏 这两个一定要对应上

Lmikic
Lmikic 谢谢你的建议,我再检查一下自己的程序
接近 4 年之前 回复

如果你每次用的内存一样,或者你可以得到一个使用内存的最大值,你可以一次性分配,放在全局变量中。而不是每次都分配/回收,这样可以解决内存泄漏的问题,也避免浪费性能。

Lmikic
Lmikic 谢谢你的建议。我试试
接近 4 年之前 回复

很可能就是你增加了释放内存的操作导致时间变长

Lmikic
Lmikic 谢谢你的回复。这个确实会增长时间,但是我用clock()函数计算的时间已经把释放内存的时间排开了
接近 4 年之前 回复

转自度娘:。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针。
具体的内部机制我也不太确定,可以试试不同大小的空间申请/释放看看。比如你释放的都是16byte的大小,然后去申请8byte的大小,是否时间不会增加?

Lmikic
Lmikic 谢谢你的回复。你的回复启发了我,然后我在函数外申请内存,重新计算调用函数的时间,但遗憾的是调用该函数的时间还是在增加。这也许说明函数也许存在其他问题。
接近 4 年之前 回复

简单点说就是有malloc后面一定要配对free,不然就会有问题内存泄露

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问