C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计
基本知识 a C++语言程序设计
动态内存不能通过变量名来使用,而只能通过指针来使用 为什么需要使用堆内存 6.2 动态内存 动态内存 是在程序运行时才可以申请、使用和释放的内存,即存放动态数据的区域 动态分配的内存都位于“堆区” 动态内存也称为“堆内存” 动态内存不能通过变量名来使用,而只能通过指针来使用 为什么需要使用堆内存 需要存储大量数据时,一般采用堆内存存储 数组元素个数在程序运行时才能确定时,只能申请使用堆内存 C++语言程序设计
6.2 动态内存 C语言的动态内存申请和释放 通过函数malloc()申请动态内存 通过函数free()释放动态内存 函数的声明包含在“stdlib.h”头文件中 C++语言程序设计
6.2 动态内存 malloc函数 原型为:void * malloc(unsigned int size); malloc函数申请size 个字节的内存空间,并返回指向所分配内存的void 类型的指针(void *),如果没有申请到内存空间,则返回NULL void 类型的指针(void *)具有很好的通用性,可以通过类型转换赋值给任何类型的指针变量 例如:int * pn = (int *)malloc(sizeof(int)); 按照int类型数据存储空间的大小分配内存空间 整型指针pn指向该内存空间 通过*pn访问该内存空间 C++语言程序设计
6.2 动态内存 free函数 原型为:void free(void * ptr); free函数释放先前malloc所分配的内存,所要释放的内存由指针ptr指向 例如:释放前例用malloc函数申请的动态内存 free(pn); pn=NULL; 因为pn指向的内存已释放,但pn的值还存在,为其赋值0后,可以避免使用它来访问无效内存 C++语言程序设计
动态内存使用完毕后,要用delete运算符来释放 6.2 动态内存 C++的动态内存申请和释放 使用new、delete运算符 使用运算符new申请单个动态数据 格式:new <类型名> (初值) 如果申请成功,返回指定类型内存的地址;如果申请失败,返回NULL指针 例如:int *pi=0; pi = new int(10); //*pi的值是10 动态内存使用完毕后,要用delete运算符来释放 格式:delete <指针名>; 上例:delete pi; pi=NULL; C++语言程序设计
6.2 动态内存 使用new申请动态一维数组 释放动态数组空间都用相同的表达式 格式:new <类型名> [表达式] 表达式用来指定数组大小 在动态申请数组空间时,不可以对数组进行初始化 例如:int *piarray=new int[10]; 释放动态数组空间都用相同的表达式 格式:delete [ ]<指针名>; 例如:delete[ ] piarray; piarray=NULL; C++语言程序设计
6.2 动态内存 例:在堆内存中申请空间存放大数组 C++语言程序设计 //堆内存的申请和释放 #include <iostream> #include <ctime> using namespace std; void main() { const int N = 10000000; int *parr = new int[N]; // int *parr = (int *)malloc(N * sizeof(int)); srand(time(NULL)); int *pm = parr; for (int i=0; i<10; i++) { *pm = rand()%100; pm++; } for (int i=0; i<20; i++) cout<<*(parr+i)<<endl; delete [] parr; //free(parr); C++语言程序设计