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 函数与之对应。
  • 每次分配内存之后应该及时的进行初始化。
  • 每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。
  • 在对指针赋值前,一定要确保没有内存位置会变为孤立的。
posted @   风恬月淡时  阅读(212)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示