还剩1页未读,继续阅读
文本内容:
C++动态内存了解动态内存在C++中是如何工作的是成为一名合格的C++程序员必不可少的C++程序中的内存分为两个部分栈在函数内部声明的所有变量都将占用栈内存堆这是程序中未使用的内存,在程序运行时可用于动态分配内存很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定在C++中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址这种运算符即new运算符如果您不再需要动态分配的内存空间,可以使用delete运算符,删除之前由new运算符分配的内存new和delete运算符下面是使用new运算符来为任意的数据类型动态分配内存的通用语法newdata-type;在这里,datatype可以是包括数组在内的任意内置的数据类型,也可以是包括类或结构在内的用户自定义的任何数据类型让我们先来看下内置的数据类型例如,我们可以定义一个指向double类型的指针,然后请求内存,该内存在执行时被分配我们可以按照下面的语句使用new运算符来完成这点double*pvalue=NULL;//初始化为null的指针pvalue=newdouble;//为变量请求内存如果自由存储区已被用完,可能无法成功分配内存所以建议检查new运算符是否返回NULL指针,并采取以下适当的操作double*pvalue=NULL;if!pvalue=newdouble{coutError:outofmemory.Hendl;exitl;}malloc函数在C语言中就出现了,在C++中仍然存在,但建议尽量不要使用malloc函数new与malloc函数相比,其主要的优点是,new不只是分配了内存,它还创建了对象在任何时候,当您觉得某个已经动态分配内存的变量不再需要使用时,您可以使用delete操作符释放它所占用的内存,如下所示:下面的实例中使用了上面的概念,演示了如何使用new和delete运算符实例#includeiostreamusingnamespacestd;intmain{double*pvalue=NULL;//初始化为null的指针pvalue=newdouble;//为变量请求内存*pvalue=
29494.99;II在分配的地址存储值coutValueofpvalue:*pvalueendl;deletepvalue;//释放内存return0;}当上面的代码被编译和执行时,它会产生下列结果Valueofpvalue:29495数组的动态内存分配假设我们要为一个字符数组一个有20个字符的字符串分配内存,我们可以使用上面实例中的语法来为数组动态地分配内存,如下所示char*pvalue=NULL;//初始化为null的指针pvalue=newchar
[20];//为变量请求内存要删除我们刚才创建的数组,语句如下delete[]pvalue;//删除pvalue所指向的数组下面是new操作符的通用语法,可以为多维数组分配内存,如下所示一维数组//动态分配j数组长度为mint*array=newint[m];〃释放内存delete[]array;二维数组intarray//假定数组第一维长度为m第二维长度为n//动态分配空间array=newint*[m];forinti=0;im;i++{array[i]=newint[n];}//释放forinti=0;im;i++{delete[]array[i];}delete[]array;二维数组实例测试实例#includeiostreamusingnamespacestd;intmain{int**p;intij;//p
[4]
[8]〃开始分配4行8列的二维数据p=newint*
[4];fori=0;i4;i++{p[i]=newint
[8];}fori=0;i4;i++forj=0;j8;j++{p[i][j]=j*i;}}//打印数据fori=0;i4;i++{forj=0;j8;j++{ifj==0coutendl;coutp[i][j],,\tn;}}//开始释放申请的堆fori=0;i4;i++{delete[]p[i];}delete[]p;return0;}三维数组int***array;//假定数组第一维为m第二维为n第三维为h//动态分配空间array=newint**[m];forinti=0;im;i++{array[i]=newint*[n];forintj=0;jn;j++{array[i][j]=newint[h];}}//释放forinti=0;im;i++{forintj=0;jn;j++{delete[]array[i][j];}deletef]array[i];}delete[]array;三维数组测试实例实例#includeiostreamusingnamespacestd;intmain{intijk;//p
[2]
[3]
[4]int***p;p=newint**
[2];fori=0;i2;i++{p[i]=newint*
[3];forj=0;j3;j++p[i][j]=newint
[4];}//输出p[i][j][k]三维数据fori=0;i2;i++{forj=0;j3;j++{fork=0;k4;k++{p[i][j][k]=i+j+k;coutp[i][j][k]}coutendl;}coutendl;}//释放内存fori=0;i2;i++{forj=0;j3;j++{delete[]p[i][j];}}fori=0;i2;i++{delete[]p[i];}delete[]p;return0;}对象的动态内存分配对象与简单的数据类型没有什么不同例如,请看下面的代码,我们将使用一个对象数组来理清这一概念实例#includeiostreamusingnamespacestd;classBox{public:Box{cout“调用构造函数!endl;}~Box{cout”调用析构函数!endl;}};intmain{Box*myBoxArray=newBox
[4];delete[]myBoxArray;//删除数组return0;}如果要为一个包含四个Box对象的数组分配内存,构造函数将被调用4次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)当上面的代码被编译和执行时,它会产生下列结果:调用构造函数!调用构造函数!调用构造函数!调用构造函数!调用析构函数!调用析构函数!调用析构函数!调用析构函数!。