0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

内存泄漏有什么影响

学益得智能硬件 来源:学益得智能硬件 2023-12-07 09:42 次阅读

用malloc申请的内存,没有释放,为什么程序也不会出错?

最近有好几位同学提出了这个问题。

讲到C语言指针的时候,我们都会反复强调,malloc申请的堆内存,用完后一定要用free释放掉,否则光申请不释放,内存就会变的越来越少,这种现象就叫做内存泄漏。

泄漏到一定程度,没有内存可用,程序可能就会奔溃。

很多同学在写代码的时候,经常忘记释放内存,比如这段代码:

#include


void test()
{
chat*s=(char*)malloc(sizeof(char)*1024 * 1024);
}


int main()
{
    test();
    
    return 0;
}

申请了1M堆内存,在程序的任何地方都没有释放。

运行程序后,一切正常,而且即使运行了很多遍,系统也没有问题。

要解释这个问题,就不得不提操作系统的内存管理。

不管是在 Linux 还是 Windows 下写代码,我们用的内存都是虚拟内存。

以 32 位 Linux 为例,每个进程启动的时候,系统都会给他分配4个G的虚拟内存空间,分为用户态和内核态,用户态又分成了堆、栈、数据段、代码段等等。

wKgZomVxIzuAdXqNAAiQ2d76vq4801.jpg

由于不同的进程使用的虚拟地址空间不同,所以即使程序出现了段错误,也就是进程本身异常退出,并不会影响其他程序的运行。

程序里面用malloc申请的就是堆空间这一段,如果程序一直在运行不会结束,并且一直在申请没有释放,那过一段时间后程序确实会奔溃。

但是我们学习的时候,更多的是一些测试程序,运行一下程序就结束。进程一旦结束,系统就会回收这段虚拟内存空间,对整个系统或者其他程序也不会产生什么影响。

平时写一些测试程序,还是应该养成释放的习惯,放在大型项目中,内存泄漏既有危害又难排查。

最后,给大家留一个问题,申请的堆内存,需要用free来释放,那同一块内存用free释放两次有没有问题?

这个问题在学习的时候也是经常遇到,如果你在Linux下做开发,这个现象就是释放两次出现的:

wKgaomVxIzqAR84QAAHCstAd15U794.jpg

如果往上翻的话,还能看到double free字样,所以,同样的一块堆内存,只能释放一次。


审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128763
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79544
  • 指针
    +关注

    关注

    1

    文章

    473

    浏览量

    70363
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66772
  • 内存泄漏
    +关注

    关注

    0

    文章

    38

    浏览量

    9166

原文标题:内存泄漏有什么影响

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux内核内存泄漏怎么办

    在Linux内核开发中,Kmemleak是一种用于检测内核中内存泄漏的工具。
    发表于 07-04 11:04 597次阅读

    如何监测内存泄漏

    如何监测内存泄漏 版权申明本文可以被自由转载,但是必须遵循如下版权约定:1、保留本约定,并保留在文章的开头部分。2、不能
    发表于 02-01 11:45 343次阅读

    C++内存泄漏检测拾遗

    在MFC开发环境中,当运行退出了,Visual Studio会在输出窗口提示是否有内存泄漏。也可以借助MFC类CMemoryState动态地检测并输出内存泄漏信息。  
    发表于 05-27 09:59 892次阅读

    C++内存泄漏分析方法

    C++是一种非常流行的计算机编程语言,在使用的过程中容易出现内存泄漏问题,而该问题往往难以识别。给出了一种对C++内存泄漏问题进行分析的方法,该方法得到C++源代码的抽象语法树,从抽象
    发表于 11-23 11:19 5次下载
    C++<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>分析方法

    ThreadLocal发生内存泄漏的原因

    ,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析 ThreadLocal 内存泄漏的问题 ThreadLocal 实现原理 ThreadLocal为什么会
    的头像 发表于 05-05 16:23 3488次阅读

    内存泄漏的特点和类型

    在计算机科学中,内存泄漏(memory leak)指由于疏忽或错误使程序未能释放而造成不能再使用的内存的情况。内存泄漏并非指
    的头像 发表于 06-20 10:58 2553次阅读

    内存泄漏问题原理及检视方法

    可能不少开发者都遇到过内存泄漏导致的网上问题,具体表现为单板在现网运行数月以后,因为内存耗尽而导致单板复位现象。一方面,内存泄漏问题属于比较
    的头像 发表于 10-10 10:42 2264次阅读

    如何避免内存泄漏的方法和原则

    本文向读者介绍了如何避免内存泄漏的方法和原则,在细节和大体方向上均给出一些可行性方案。读者可以尝试文中提出的方法,改进自己的代码,大大减少内存泄漏的可能性。
    的头像 发表于 10-21 14:30 5609次阅读
    如何避免<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>的方法和原则

    如何使用ThreadLocal来避免内存泄漏

    本次给大家介绍重要的工具ThreadLocal。讲解内容如下,同时介绍什么场景下发生内存泄漏,如何复现内存泄漏,如何正确使用它来避免内存
    的头像 发表于 08-20 09:29 3879次阅读
    如何使用ThreadLocal来避免<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>

    什么是内存泄漏内存泄漏有哪些现象

    内存泄漏几乎是很难避免的,不管是老手还是新手,都存在这个问题,甚至 Windows 与 Linux 这类系统软件也或多或少存在着内存泄漏
    的头像 发表于 09-05 17:24 8943次阅读

    怎么解决C语言中的内存泄漏问题呢?

    只有在堆内存里面才会发生内存泄漏的问题,在栈内存中不会发生内存泄漏。因为栈
    发表于 06-11 17:31 392次阅读
    怎么解决C语言中的<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>问题呢?

    什么是内存泄漏?如何避免JavaScript内存泄漏

    JavaScript 代码中常见的内存泄漏的常见来源: 研究内存泄漏问题就相当于寻找符合垃圾回收机制的编程方式,有效避免对象引用的问题。
    发表于 10-27 11:30 128次阅读
    什么是<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>?如何避免JavaScript<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>

    内存泄漏会产生哪些后果

    内存泄漏原因 内存泄漏在C/C++这种不带GC(Garbage Collection)的语言里,是一个经常发生的问题。因为没有GC,所以分配的内存
    的头像 发表于 11-10 15:06 394次阅读
    <b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>会产生哪些后果

    线程内存泄漏问题的定位

    记录一个关于线程内存泄漏问题的定位过程,以及过程中的收获。 1. 初步定位 是否存在内存泄漏:想到内存
    的头像 发表于 11-13 11:38 323次阅读
    线程<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>问题的定位

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈
    发表于 03-19 11:38 163次阅读
    C语言<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>问题原理