C++编程中如何防止内存溢出问题?

 我来答
琳大小姐157
2012-11-23 · TA获得超过204个赞
知道答主
回答量:143
采纳率:0%
帮助的人:60.2万
展开全部
1.
良好的编程习惯是预防内存漏洞的根本2.
正确申请和释放内存空间。3.
记得在每个可能的出口检查指针
导致内存溢出问题的原因有很多,比如:(1)使用非类型安全
(non-type-safe)的语言如C/C++等。
(2)以不可靠的方式存取或者复制内存缓冲区。
(3)编译器设置的内存缓冲区太靠近关键数据结构
下面来分析这些因素:1.
内存溢出问题是C语言或者C++语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性
(type-safety)
。众所周知,用C/C++语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了C/C++语言代码的性能。只要合理编码,
C/C++应用程序在执行效率上必然优于其它高级语言。然而,
C/C++语言导致内存溢出问题的可能性也要大许多。其他语言也存在内容溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。2.
当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了N字节大小的内存缓冲区,随后又向其中复制超过N字节的数据)
最重要的是,
C/C++编译器开辟的内存缓冲区常常邻近重要的数据结构。现在假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。非但如此,
C++的某些其它数据结构,比如v-table、例外事件处理程序、函数指针等,也可能受到类似的攻击。
二、解决内存溢出问题
必须知道内存缓冲区的总长度。
检验内存缓冲区。
提高警惕。
多态性,在c++中指具有不同功能的函数可以用同一个函数名,即可以用同一个函数名调用不同内容的函数。向不同的对象发送用一个消息,不同的对象在接收同样的消息,会产生不同的行为(方法)。
  从系统实现角度来看。多态性分为两类:静态多态性和动态多态性。
  静态多态性:在程序编译时系统就能决定调用哪个函数,因此静态函数有称编译时的多态性(实质上是通过函数的重载实现)
。例如:函数的重载和运算符重载实现.
  动态多态性:运行过程中才动态地确定操作指针所指的对象。主要通过虚函数和重写来实现。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式