文章目录
【 1. new和delete运算符 】 1.1 new 分配内存 1.2 delete 释放内存 1.3 实例
【 2. 数组的动态内存分配 】
【 3. 对象的动态内存分配 】
C++ 程序中的内存分为两个部分:
栈 :在 函数内部 声明的所有变量都将占用栈内存 。 堆 :这是程序中未使用的内存,在程序运行时可用于 动态分配内存 。
【 1. new和delete运算符 】
在 C++ 中,我们可以使用 new 运算符 为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址 。 如果我们不再需要动态分配的内存空间,可以使用 delete 运算符 删除之前由 new 运算符分配的内存 。
1.1 new 分配内存
new 运算符来为任意的数据类型动态分配内存的通用语法:
new data- type;
实例 定义一个指向 double 类型的指针,然后请求内存,该内存在执行时被分配:
double * pvalue = NULL ;
pvalue = new double ;
检查内存是否分配成功 :如果自由存储区已被用完,可能无法成功分配内存。所以建议检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作:
double * pvalue = NULL ;
if ( ! ( pvalue = new double ) )
{
cout << "Error: out of memory." << endl;
exit ( 1 ) ;
}
malloc() 函数 在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量 不要使用 malloc() 函数 。new 与 malloc() 函数相比,其主要的优点是:new 不只是分配了内存,它还创建了对象。
1.2 delete 释放内存
在任何时候,当我们觉得某个已经动态分配内存的变量不再需要使用时,我们可以使用 delete 操作符释放它所占用的内存,释放内存的通用算法:
delete pvalue;
1.3 实例
# include <iostream>
using namespace std;
int main ( )
{
double * pvalue = NULL ;
pvalue = new double ;
* pvalue = 29494.99 ;
cout << "Value of pvalue : " << * pvalue << endl;
delete pvalue;
return 0 ;
}
【 2. 数组的动态内存分配 】
2.1 一维数组
int * array= new int [ m] ;
delete [ ] array;
char * pvalue = NULL ;
pvalue = new char [ 20 ] ;
delete [ ] pvalue;
2.2 二维数组
int * * array
array = new int * [ m] ;
for ( int i= 0 ; i< m; i++ )
{
array[ i] = new int [ n] ;
}
for ( int i= 0 ; i< m; i++ )
{
delete [ ] arrary[ i] ;
}
delete [ ] array;
# include <iostream>
using namespace std;
int main ( )
{
int * * p;
int i, j;
p = new int * [ 4 ] ;
for ( i= 0 ; i< 4 ; i++ ) {
p[ i] = new int [ 8 ] ;
}
for ( i= 0 ; i< 4 ; i++ ) {
for ( j= 0 ; j< 8 ; j++ ) {
p[ i] [ j] = j* i;
}
}
for ( i= 0 ; i< 4 ; i++ ) {
for ( j= 0 ; j< 8 ; j++ )
{
if ( j== 0 ) cout<< endl;
cout<< p[ i] [ j] << "\t" ;
}
}
for ( i= 0 ; i< 4 ; i++ ) {
delete [ ] p[ i] ;
}
delete [ ] p;
return 0 ;
}
2.3 三维数组
int * * * array;
array = new int * * [ m] ;
for ( int i= 0 ; i< m; i++ )
{
array[ i] = new int * [ n] ;
for ( int j= 0 ; j< n; j++ )
{
array[ i] [ j] = new int [ h] ;
}
}
for ( int i= 0 ; i< m; i++ )
{
for ( int j= 0 ; j< n; j++ )
{
delete [ ] array[ i] [ j] ;
}
delete [ ] array[ i] ;
}
delete [ ] array;
# include <iostream>
using namespace std;
int main ( )
{
int i, j, k;
int * * * p;
p = new int * * [ 2 ] ;
for ( i= 0 ; i< 2 ; i++ )
{
p[ i] = new int * [ 3 ] ;
for ( j= 0 ; j< 3 ; j++ )
p[ i] [ j] = new int [ 4 ] ;
}
for ( i= 0 ; i< 2 ; i++ )
{
for ( j= 0 ; j< 3 ; j++ )
{
for ( k= 0 ; k< 4 ; k++ )
{
p[ i] [ j] [ k] = i+ j+ k;
cout<< p[ i] [ j] [ k] << " " ;
}
cout<< endl;
}
cout<< endl;
}
for ( i= 0 ; i< 2 ; i++ )
{
for ( j= 0 ; j< 3 ; j++ )
{
delete [ ] p[ i] [ j] ;
}
}
for ( i= 0 ; i< 2 ; i++ )
{
delete [ ] p[ i] ;
}
delete [ ] p;
return 0 ;
}
【 3. 对象的动态内存分配 】
对象的动态内存分配与简单的数据类型类似。 实例: 为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。
# include <iostream>
using namespace std;
class Box
{
public :
Box ( ) {
cout << "调用构造函数!" << endl;
}
~ Box ( ) {
cout << "调用析构函数!" << endl;
}
} ;
int main ( )
{
Box* myBoxArray = new Box[ 4 ] ;
delete [ ] myBoxArray;
return 0 ;
}