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

    文章

    7604

    浏览量

    136779
  • 程序
    +关注

    关注

    117

    文章

    3786

    浏览量

    81027
  • 指针
    +关注

    关注

    1

    文章

    480

    浏览量

    70560
  • 代码
    +关注

    关注

    30

    文章

    4786

    浏览量

    68568
  • 内存泄漏
    +关注

    关注

    0

    文章

    39

    浏览量

    9218

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

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

收藏 人收藏

    评论

    相关推荐

    Linux内存泄漏检测实现原理与实现

    在使用没有垃圾回收的语言时(如 C/C++),可能由于忘记释放内存而导致内存被耗尽,这叫 内存泄漏。由于内核也需要自己管理内存,所以也可能出
    发表于 12-09 11:11 970次阅读

    错误910:进程内存不足

    REAL>错误引脚泄漏内存泄漏多大?它是每个错误几k,还是它取决于错误的类型?如果它是一个小的内存
    发表于 10-15 07:52

    C++内存泄漏

    C++内存分配与释放均由用户代码自行控制,灵活的机制有如潘多拉之盒,即让程序员了更广的发挥空间,也产生了代代相传的内存泄漏问题。对于新手来说,最常
    发表于 09-15 17:39 16次下载

    内存泄漏的特点和类型

    内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,
    的头像 发表于 06-20 10:58 2824次阅读

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

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

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

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

    【openssl】从openssl的常用接口浅谈【内存泄漏

    使用openssl内存泄露风险吗?从openssl的常用接口调用浅谈【内存泄漏】的风险和规避。
    的头像 发表于 08-31 11:24 3186次阅读
    【openssl】从openssl的常用接口浅谈【<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>】

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

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

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

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

    内存泄漏如何避免

    的数,那就是内存溢出。 2. 内存泄漏 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的
    的头像 发表于 11-10 11:04 746次阅读
    <b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>如何避免

    内存泄漏会产生哪些后果

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

    线程内存泄漏问题的定位

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

    内存溢出与内存泄漏:定义、区别与解决方案

    内存溢出与内存泄漏:定义、区别与解决方案  内存溢出和内存泄漏是计算机科学中常见的问题,在开发和
    的头像 发表于 12-19 14:10 2760次阅读

    C语言内存泄漏问题原理

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

    如何检测内存泄漏

    检测内存泄漏是软件开发过程中一项至关重要的任务,它有助于识别和解决那些导致程序占用过多内存资源,从而影响程序性能甚至导致程序崩溃的问题。以下将详细阐述几种常见的内存
    的头像 发表于 07-30 11:50 1866次阅读