c语言的内存泄漏问题
在今天的动态内存分配的学习中,我遇到了内存泄漏问题,自己开辟的空间,自己找不到了,并且系统也无法使用,通过查找资料
得到了比较加深的见解。
C语言什么是内存泄漏,怎么避免内存泄漏
一、内存溢出
内存溢出OOM(out of memory),是指程序在申请内存时,没有足够的内存空间给其使用,出现out of memory;
比如申请了一个int,但是给了他一个long才能存下的数,这样就是内存溢出。
二、内存泄漏
内存泄漏(memory leak)是指程序在申请内存后,无法释放已经申请的内存空间,一次内存泄漏的危害可以忽略 但是内存泄漏堆积后,后果很严重,无论多少内存,都会被占光,最后导致OOM;
内存泄漏:
是指你向系统申请分配内存使用,可是用完了之后却不归还,如果你申请的那块空间你自己也不可以在访问(也许是你把地址弄丢了)而系统也不可以把它再次分配给需要的程序。
三、造成内存泄漏的三种情况
(1)指针的重新赋值
如下代码:
char* p=(char*)malloc(10);
char* q=(char*)malloc(10);
//指针p与q都被分配了10个字节的内存
//如果程序执行我的下面这个语言
p=q;
//指针变量p被变量q重新赋值,导致p原本指向的空间变成了孤立的空间,无法释放,导致内存泄漏。
(2)错误的内存释放
假设有一个指针变量p,指向了一个十个字节的内存位置,该内存的第三个字节np又指向另一个动态分配10字节的内存位置,如果执行:
free(p);
很显然,当调用函数free去释放内存p时,另一个内存被孤立,成为了孤立空间,导致内存泄漏。
正确的方法应该时:
free(p->np);
free(p);
四、如何避免内存泄漏
- 确保没有访问空指针
- 每个内存分配函数都应该有一个 free 函数与之对应。
- 每次分配内存之后应该及时的进行初始化。
- 每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。
- 在对指针赋值前,一定要确保没有内存位置会变为孤立的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)