C++语言教学中内存使用的若干问题.doc
文本预览下载声明
C++语言教学中内存使用的若干问题
摘要:该文主要探讨了C++语言教学中在数组使用、动态内存管理、指针使用、浅拷贝等方面应注意的若干问题,并指出正确的处理方法,最后介绍了C++/CLR中的内存管理机制。
关键词:数组;动态内存管理;指针;浅拷贝;CLR
中图分类号:G642文献标识码:A文章编号:1009-3044(2009)31-0000-00
Some Notices about the Use of Memory in C++ Language Teaching
RUAN Zong-li, CHEN Hua, ZHANG Hua-qing
(College of Mathematics and Computation Science, China University of Petroleum, Dongying 257061, China)
Abstract: In this paper, some problems about the use of array, dynamic memory management, pointer, shallow copy and so on in c++ language teaching are discussed. The correct methods of operating are given. In the end, memory management mechanism of C++/CLR is introduced briefly.
Key words: array; dynamic memory management; pointer; shallow copy; CLR
程序设计语言C++在科研、教学、工程、生产、设计等领域具被广泛使用,这得益于它的直接访问内存的灵活、支持面向对象机制、代码运行高效等优点。但是,从教学实践中发现,作为初学者,在用C++编写程序时很容易出错,因此有必要指出其中的出错点。
下面先探讨ISO/ANSI C++中内存访问中值得注意的几个问题。
1 数组使用
数组是一种线性表数据结构,系统为其分配连续的内存空间,即数据元素按索引顺序连续存储,可以通过下标运算方便快速地访问其中数据,它在程序设计中被频繁使用。以下3个问题需要注意:
1)声明数组时指定的长度一定是常量表达式
int A[10],B[10+5];//正确,10和5为字面常量,故10和10+5均为常量表达式
int n=10;
int C[n],D[n+5];//错误,n为变量,故n和n+5均为变量表达式
const int N=10;
int E[N],F[N+5];//正确,N为符号常量,N和N+5均为常量表达式
2)访问不要越界,包括数组上界和下界
假设有数组int A[10];,则A[i]中的i只能为0到9,而小于0或大于9都属于越界,越界访问可能导致不可意料的错误,例如试图访问的操作系统所占用的内存,非常危险。C++编译器并没有给数组访问做越界检查,因此只有程序员谨慎使用。
3)数组长度不能过大
数组所占用的空间是连续的,即一个元素的空间紧挨着下一个元素的空间,这些空间是由编译系统自动分配的。编译系统自动分配的内存在被称为栈的内存块上[1],栈的的大小是一个编译时就确定的常数,如果申请的空间超过栈的剩余空间时,将提示溢出。因此,能从栈获得的空间较小。
如果元素数量很大,则不宜使用长度固定的数组,取而代之的可以是链表或动态分配的数组等,尤其是链表,系统将其每一个元素分配内存中任意一块可用的空间,整个链表占用的空间是非连续的,这是与数组的重要区别之处,但是链表元素不能像数组一样能随机访问,而只能顺序访问,显然效率要低。
链表结点元素空间是在被称为堆的内存块上申请的[1]。操作系统有一个记录堆上空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。动态申请的内存也是在堆上分配的。一般情况下,堆内存远比栈内存大,动态分配大块连续内存空间的成功率较高。
2 动态内存管理
运算符new/delete用于完成动态内存的申请与释放,使用中应注意以下几点:
1)动态申请不成功
以int *p=new int[n];为例,语句中动态申请有可能不成功,例如n很大而堆上空闲的连续内存空间都很小时,此时new 运算返回空指针,使用时应作检查,如果为空即p==0,则不能进行后续操作。程序中做这种检查是一个好的习
显示全部