[计算机软件及应用]第3章数组与指针.ppt

[计算机软件及应用]第3章数组与指针

动态申请内存与释放 程序中定义的变量、数组,其对应的空间由系统在编译时分配。 若在编写程序时,有些数据空间的大小不能确定,只有在程序运行时才能确定,可以安排在程序运行时根据需要动态申请内存空间。 动态内存分配技术使用new和delete两个运算符。 运算符new用于申请一块动态空间。 用new申请的空间不需要时使用运算符delete释放。 The computer’s memory As a program sees it Local variables “lives on the stack” Global variables are “static data” The executable code are in “the code section” 动态申请内存运算符 new 使用格式: 指针 = new 数据类型名; 指针 = new 数据类型名 ( 初始值 ); 作用:在程序运行期间,从堆内存区域动态申请指定数据类型所需的内存空间。若分配成功,新分配的内存的首地址赋给指针,否则,指针得到一个空地址0(NULL)。 用new运算符动态分配一个变量的内存空间 一个元素 int* p1 = new int; //get (allocate) a new uninitialized int int* p2 = new int(5); // get a new int initialized to 5 5 p2: ??? p1: 格式: 指针= new 数据类型[元素个数] 例: int *q = new int[5]; //创建5个元素的整型数组 int *p = new int [n]; //创建n个元素的整型数组 p n个元素的整型数组 . . . 用new运算符动态分配一块连续的数组空间 q: 通过指针访问数据 数组 int* p3 = new int[5]; // get (allocate) 5 ints p3[0] = 7; p3[1] = 9; int x2 = p3[1]; // get the value of the 2nd element of p3 int x3 = *p3; // we can also use the dereference operator * for an array // *p3 means p3[0] (and vice versa) 7 9 p3: A pointer does not know how many elements it points to 释放内存运算符delete 作用:释放用new创建的动态存储单元。 两种格式: delete 指针名; //释放由new分配给单个对象的内存 delete []指针名; //释放由new分配给数组对象的内存 例如: int *pi = new int( 5 ); … delete pi;  char *pc = new char[20]; … delete []pc; 一个问题: 指针悬挂 delete运算符只释放动态申请到的内存单元,并不删除指针。安全的做法是将指针变量置为“空”。 例: int *p; p = new int; : delete p; //“指针悬挂” : *p = 15; //不安全用法,使用已释放的内存空间很可能出错 p = 0; //安全用法 p: 一个问题:Memory Leak(内存泄漏) 对申请到的空间在释放前不要将其地址弄丢,否则会出现“内存泄漏” double* p = new double[27]; // … p = new double[42]; // … delete[] p; p: 第二个值 第一个值 第一个数组泄漏 例:计算一批数据的算术平均值。 #includeiostream.h #include stdlib.h void main() { int m , *p, i; cout 输入数据个数:; cin m; p = new int[m]; //动态申请内存单元 if ( p =

文档评论(0)

1亿VIP精品文档

相关文档