• 内存泄露 是什么


    在计算机科学中,内存泄漏(memory leak)指由于疏忽或错误造成程 序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

     

    【PS1】申请了内存,而没有释放内存。
    如执行了如int *p=(int *)malloc(sizeof(int));的语句,但没有在程序末尾用free(p)释放内存,申请的内存就会一直处于被占用状态,就是内存泄露。

    【PS2】应用程序的内存分为四块:堆区,栈区,全局数据区,代码区  
    其中堆区需要程序员自己管理,我们申请的动态变量就存放在堆区,用完后需要程序员自己手动释放,若申请了一块动态内存,未释放,却丢失了指向性,这就叫内存泄露 会导致程序的可用内存减少,严重的话会拖垮操作系统

     

    在Windows操作系统中,计算机的内存被Windows内核严重保护,Windows的内核执行在ring0级别上,而所有应用程序执行的权限是在ring3级别上。ring0可以访问整个系统中的所有硬件资源,也就是访问内存等。而ring3则根本访问不到。操作系统分配个应用程序使用的内存叫“线性内存地址”,在单个应用程序看来,这只是一个线性的数字,从低到高,而具体这个数字映射在真是物理内存的什么部位,以及是否已经被转存到内存交换页文件中,应用程序都不得而知。记住,所有的内存访问都是Windows在维护。

    那么应用程序提示说“某某地址不能read,written”是什么意思呢?这是软件开发人员在软件执行的过程中,没有合理检测程序代码里面的指针指向的线性地址导致的。引起的原因有2个:

    1. 一个指针指向了一块被保护的线性内存地址,也就是说,指向了本不该指向的地方
    2. 一个指针在没有分配内存的情况下,被程序代码读取或者写入

    记住,这种问题是软件代码劣质的表现,同时也可能因为某些dll的版本不同,低版本没有修正代码中的 检测,而高版本修正了,之类的,也会出现。

    解决的办法是重新安装应用软件,或者升级软件。

    上面谈到的是常规出现的这种情况。但是如果计算机中了病毒,或者木马,那么木马和病毒插入的代码可能在内存中访问到改写或者释放了的线性内存地址,也会导致这样的情况发生。但是这样的问题要查找起来比较麻烦。

    最后,驱动也可以访问内存,甚至是物理内存。但是如果驱动访问失败,您不会收到任何窗口提示,而是直接蓝屏了。

  • 相关阅读:
    https://github.com/fffaraz/awesome-cpp 清单
    https://github.com/ziadoz/awesome-php 清单
    直播系统的流媒体怎么传输才不会卡顿?
    如何搭建一个完整的视频直播系统?
    html的rowspan和colspan
    Redisson分布式锁实战(适用于Redis高并发场景)
    Spring Boot JDBC:加载DataSource过程的源码分析及yml中DataSource的配置
    SpringBoot 为什么能够自动的注入一些常用的Bean ?
    @JsonFormat与@DateTimeFormat注解的使用
    Failed to bind properties under 'spring.datasource' to javax.sql.DataSource
  • 原文地址:https://www.cnblogs.com/fag888/p/5789194.html
Copyright © 2020-2023  润新知