内存泄漏 和 内存溢出

在计算机科学中,内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,严格意义上来说这是不准确的。

  一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。

这是程序语言中的一个概念,典型的,在C语言中,在分配数组时为其分配的长度是1024,但往其中装入超过1024个数据时,由于C语言不会对数组操作进行越界检查,就会造成内存溢出错误


在程序员设计的代码中包含的“内存溢出”漏洞实在太多了。
导致内存溢出问题的原因有很多,比如: 
(1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。 
(2) 以不可靠的方式存取或者复制内存缓冲区。 
(3) 编译器设置的内存缓冲区太靠近关键数据结构。 
下面来分析这些因素: 
1. 内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。众所周知,用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。只要合理编码,C/C++ 应用程序在执行效率上必然优于其它高级语言。然而,C/C++ 语言导致内存溢出问题的可能性也要大许多。其他语言也存在内容溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。 
2. 当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了 N 字节大小的内存缓冲区,随后又向其中复制超过 N 字节的数据)。内存缓冲区就可能会溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出来的 4 盎司水怎么办?当然会满到玻璃杯外面了! 
3. 最重要的是,C/C++ 编译器开辟的内存缓冲区常常邻近重要的数据结构。现在假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。非但如此,C++ 的某些其它数据结构,比如 v-table 、例外事件处理程序、函数指针等,也可能受到类似的攻击。

转载于:https://www.cnblogs.com/reynold-lei/p/3461322.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不要被泛型和向后兼容性所愚弄。 使用泛型类型

最近,我与jOOQ的早期客户Ergon的 Sebastian Gruber进行了非常有趣的讨论,我们与之保持了密切联系。 与Sebastian交谈使我们的工程团队得出结论,认为我们应该完全重写jOOQ API。 现在,我们已经有很多用于各种用途的泛型&#xff0c…

java 什么是耦合_什么是耦合、解耦

什么是耦合、解耦一、耦合1、耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。2、在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使类和构…

基于SharePoint 的企业信息平台架构

转载于:https://www.cnblogs.com/jackljf/p/3589224.html

java bufferarray_Java中的ByteBuffer array()方法

可以使用array()类java.nio.ByteBuffer中的方法获得缓冲区的字节数组。如果返回的数组被修改,则缓冲区的内容也会被类似地修改,反之亦然。如果缓冲区是只读的,则抛出ReadOnlyBufferException。演示此的程序如下所示-示例import java.nio.*;im…

java freemarker 分页_10小时入门java开发04 springboot+freemarker+bootstrap快速实现分页功能...

本节是建立在上节的基础上,上一节给大家讲了管理后台表格如何展示数据,但是当我们的数据比较多的时候我们就需要做分页处理了。这一节给大家讲解如何实现表格数据的分页显示。准备工作还是老规矩,看效果图可以看出我们实现了如下功能1&#x…

获取linux服务器基本信息脚本

为了方便日常运维写的一段简单脚本,用于集中获取服务器操作系统、CPU、内存使用、负载、硬盘使用、网络信息。 脚本比较简单,就不解释了,有兴趣的朋友请自行查看。 #!/bin/bash##Name:system_info#Ver:1.0#Author:lykyl###程序说明:#获取服务…

您认为有关垃圾收集的7件事-完全错了

关于Java垃圾收集的最大误解是什么,它的真实情况如何? 小时候,我的父母曾经告诉我,如果我学习不好,我将成为垃圾收集者。 他们所知道的很少,垃圾回收实际上很棒。 也许这就是为什么即使在Java世界中&#…

java $p_javap -c命令详解

一直在学习Java,碰到了很多问题,碰到了很多关于i和i的难题,以及最经典的String str "abc" 共创建了几个对象的疑难杂症。 知道有一日知道了java的反汇编 命令 javap。现将学习记录做一小结,以供自己以后翻看。如果有错误的地方&a…

hibernate 映射四多对一双向映射

学生和班级的例子来说,多个学生可以对应一个班级。 1.站在学生角度来说,学生就是多端。那么我们可以通过多对一来维护2者的关系。 2.站在班级的角度来说,班级就是一端。那么我们可以通过一对多啦维护2者的关系。 3.我们也可以双向关联两者的关…

JS factory

http://my.oschina.net/jbryan/blog/140647转载于:https://www.cnblogs.com/zhongqiu/p/3472472.html

django mysql 表单_Python Django 表单提交数据到mysql并展示

首先1: 新建项目userproject, 新建应用childName2: 这是childName文件目录,templates文件夹放insert.html 与 show.html3: insert.html 与 show.html/**insert.html**/用户登录12345678910111213141516Title信息展示用…

java h5 上拉加载更多_移动端H5页面上拉加载更多功能实现(二)

之前已经写过一篇关于上拉加载更多的文章,那个主要是根据滚动实现分页向后台发起请求实现。这次实现方式为后台返回所有需要加载的数据,前端这边做视觉上的分页效果。实现原理也是根据滚动距离触发加载更多的条件。我这边的需求是需要在模态框里实现一个…

体验最火的敏捷——SCRUM(厦门,2014.1.4)

1.概述SCRUM是当前最火的一种敏捷开发方法,有用户故事、冲刺、燃尽图等很多很酷的玩法,有牛B的产品负责人、SCRUM Master,有超强的自组织团队。本沙龙将为您展现当前最火最酷的敏捷开发方法!内容大纲:1)SCRUM是神马东西…

摆脱困境:将属性值注入配置Bean

Spring Framework对将从属性文件中找到的属性值注入到bean或Configuration类中提供了很好的支持。 但是,如果将单个属性值注入这些类中,则会遇到一些问题。 这篇博客文章指出了这些问题,并描述了我们如何解决它们。 让我们开始吧。 如果使…

js编码java解码_js编码

虽然escape()、encodeURI()、encodeURIComponent()三种方法都能对一些影响URL完整性的特殊字符进行过滤。但后两者是将字符串转换为UTF-8的方式来传输,解决了页面编码不一至导致的乱码问题。例如:发送页与接受页的编码格式(Charset)不一致(假设发送页面是…

淘宝IP地址查询

官方网址:http://ip.taobao.com/index.php 相关文章: http://www.cnblogs.com/zetee/p/3482085.html http://www.cnblogs.com/zetee/p/3481297.html转载于:https://www.cnblogs.com/AloneSword/p/3483176.html

mysql查询各专业人数_查询各专业的学生数。

【简答题】查询“数据库”不及格的学生的学号和成绩。【判断题】螺位错可以攀移。【单选题】Internet 的核心协议是()【单选题】多媒体计算机是指()【单选题】码组10100与10001之间的码距为( )。【简答题】查询选修了“计算机基础”课程的学生学号和成绩。【单选题】小强用数码…

[SharePoint][SharePoint2013循序渐进]SPS2013简介

本章概要: 1、啥是SPS2013 2、SharePoint如何作用于团队协作和信息共享 3、SP2013有哪些用户权限 4、什么是SharePoint2013 online 5、SP在内部署和在线订阅计划的区别 6、office集成 7、与Microsoft Dynamics AX集成提供一个web前端界面 【什么是SharePoint2013】 …

python怎么改目录_如何查看文件,而不是使用Python进行更改的目录?

问题:How do I watch a file for changes using Python?建议使用看门狗,但我发现它只能观看目录,而不是文件.watchdog-test.py是看门狗的示例脚本:$python watchdog-test.py ab_test_res.sh &[1] 30628fbtfbt64:~/laike9m$Traceback (most recent c…

javascript arguments

此文为转载文章: 什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的。所有主要的js函数库都利用了arguments对象。所以agruments对象对于javascript程序员来说是必需熟悉的…