文章目录 【 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 ;
}