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

问题描述

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

C语言内存释放与调用子函数时间变长的相关文章

c语言-C语言数组作为参数传入子函数

问题描述 C语言数组作为参数传入子函数 对不起,可能我没表达清楚,我想问,数组作为参数传入子函数为什么不是作为形式参数传入,请你看程序运行结果,如果数组作为形式参数传入子函数,那么形式参数的值并不会影响原来main函数中的值,但是实际上,main函数中数组原来的值已经被修改了,这是因为数组传入的是地址(指针),我的问题就在这里,传入的是指针为什么不是用完就扔的形式参数. 这与c语言的设计有关是吗?内部有什么机制吗? 解决方案 首先提一下std C 调用约定,参数的传递使用栈. 在传递时首先将参数

c语言中如何把在子函数中用malloc开辟的空间传回主函数?

问题描述 c语言中如何把在子函数中用malloc开辟的空间传回主函数? 如何把在子函数中用malloc开辟的空间传回主函数? 我将指针传给子函数,但却没有将开辟的空间地址带回到主函数 解决方案 malloc返回的是函数指针.你直接返回这个指针就可以了. 如果是在参数中,那么看你的参数有没有加上引用符号.& 解决方案二: 可以通过返回值啊... "如何把在子函数中用malloc开辟的空间传回主函数? 我将指针传给子函数,但却没有将开辟的空间地址带回到主函数" 第一句我看懂了,第二

在调用memcpy函数时出现 异常: 0xC0000005: 读取位置 0x006bd000 时发生访问冲突

问题描述 在调用memcpy函数时出现 异常: 0xC0000005: 读取位置 0x006bd000 时发生访问冲突 BOOL Kirsch(BYTE *pData,int Width,int Height) {//定义实现Kirsch算法的8个模板: int i,j,s,t,k,max,sum[8]; static int a[3][3]={{+5,+5,+5},{-3,0,-3},{-3,-3,-3}}; static int a1[3][3]={{-3,+5,+5},{-3,0,+5},

ndk jni c++ android-Android上利用JNI调用OpenCV函数时出现Fatal signal 11错误

问题描述 Android上利用JNI调用OpenCV函数时出现Fatal signal 11错误 我想在Android上用OpenCV实现人脸识别功能,即事先有一个我提供的人脸训练库,然后检测出人脸后,识别他和训练库中的哪类人最像. 我已在windows平台实现了该功能,并将训练好的FaceRecognizer通过save的方式存储成了xml.我将xml文件放入了Android手机某目录下,然后想利用JNI的方式在Android app中使用OpenCV载入该数据库,但运行到这一行就会报错: F

java中panel实现线程接口以后,要调用repaint函数时,不进run函数

问题描述 java中panel实现线程接口以后,要调用repaint函数时,不进run函数 具体情况是 mypanel类实现了线程接口,在run函数中定义了sleep(100)后调用repaint函数,做一个小坦克游戏,在repaint之前要判断是否击中坦克,击中后要显示三张图片来体现爆炸效果,可是经过调试发现,每次第一次击中的时候,都是直接好多次repaint,没有休眠,后来发现根本就没有进mypanel的run()方法,好像有另一个其他线程再调用paint.这是怎么回事?感谢大家了 pack

控件显示-新手求助,VS调用子窗体时控件莫名其妙不见了

问题描述 新手求助,VS调用子窗体时控件莫名其妙不见了 我的主窗体的控件运行了还在,但调用的子窗体的控件就是不见了,在designer页面里也没有找到错误,快哭了,求拯救啊,还急着交作业...用的是VS2010 解决方案 是不是可见属性没设置正确啊

WebService中更新函数传入值,再调用其中函数时,函数的参数还是未改变

背景: 今天写了一个webservice,又修改了一下函数的返回类型.out参数的数量(改为:public void SendData(DataSet ds, out string result,out string errMsg)),之后更新引用,再调用的使用时候发现SendData显示为public string SendData(DataSet ds, out string errMsg)形式,不管是添加webservice还是reference service都不行,解决方案也清理过,i

在异步调用匿名函数时明智地使用局部变量

问题:由于在多线程中使用了匿名函数外的局部变量而导致的Bug 执行代码 static void Main(string[] args) { for (int i = 0; i < 10; i++) { Thread t = new Thread(delegate() { Thread.Sleep(new Random().Next(1, 10000)); Console.Write(i + ", "); }); t.Start(); } } 将得到输出:10, 10, 10, 1

调用system函数时,如何隐藏其dos窗口

http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195003