C++程序设计问题
C++程序设计时,进行动态内存分配,容易引入许多错误,有可能内存泄露,数组越界,是c++出现的错误,阐述概念,危害,预防的办法?????????
C++程序设计时,进行动态内存分配,容易引入许多错误,有可能内存泄露,数组越界,是c++出现的错误,阐述概念,危害,预防的办法?????????
答案:
内存分配方式:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的
整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集
中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多
少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期
由我们决定,使用非常灵活,但问题也最多。
常见的内存错误及其对策:
内存分配未成功,却使用了它
内存分配虽然成功,但是尚未初始化就引用它。
内存分配成功并且已经初始化,但操作越过了内存的边界。
忘记了释放内存,造成内存泄露。
释放了内存却继续使用它。
解决方案:
1.用malloc 或new 申请内存之后,应该立即检查指针值是否为NULL。
防止使用指针值为NULL 的内存。
2.不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右
值使用。
3.避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”
操
4.动态内存的申请与释放必须配对,防止内存泄漏。
5.用free 或delete 释放了内存之后,立即将指针设置为NULL,防止产
生“野指针”。
函数体内的局部变量在函数结束时自动消亡
(1)指针消亡了,并不表示它所指的内存会被自动释放。
(2)内存被释放了,并不表示指针会消亡或者成了NULL 指针。
在计算机科学中,内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,严格意义上来说这是不准确的。 一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
数组下标越界是一个程序初学者最容易犯的错误之一。 以一个简单的一维数组为例: int a[10];这是一个整型的数组a,有10个元素:a[0]-a[9],因为正确的下标应该是从0开始,到9结束,与生活习惯中的1-10不一样,于是产生一个a[10]的错误,即数组下标越界。 c和c++语言中数组下标越界,编译器是不会检查出错误的,但是实际上后果可能会很严重,比如程序崩溃等,所以在日常的编程中,程序员应当养成良好的变成习惯,避免这样的错误发生。1)内存泄漏:因为通过指针动态分配的内存不会自动被系统回收,导致这块区域永远处于“使用”而实则已经是无用的状态。
2)危害:主要是浪费有限空间、占用资源。
3)预防方法:如果用new声明指针开辟的空间,对应用delete删除;用malloc开辟的则用free删除