引言
在内存中,程序为保存某种类型数据如数组而分配 一块内存空间。 用完后就需要把先前占用的内存空间释放给内存, 以后重新分配,供程序的其它部分使用
new运算符(对应malloc函数)
new从内存中分配内存空间,并返回指向该内 存的首地址,该地址存放于指针变量中
delete运算符(对应free函数)
运算符delete用于释放new分配的内存空间,
它的使用形式为
其中的指针变量保存着new动态分配的内存的首地址
注意
(a) 用new获取的内存空间,必须用delete进行释放; (
(b) 对一个指针只能调用一次delete;
(c) 用delete运算符作用的对象必须是用new分配的内 存空间的首地址。
实例
1
2
3
4
5
6
7
8
|
#include <iostream>
using namespace std;
int main() {
int *p;
p=new int; // 分配内存空间 *p=5;
cout<<*p;
delete p;
}// 释放内存空间
|
用new建立数组类型的变量
1
|
指针变量 = new 数据类型[数组大小] ;
|
此时指针变量指向第一个数组元素的地址。使用new 分配数组时,不能提供初始值
使用new建立的数组 变量也由delete释放,其形式为:
同样,也可以用new来为多维数组分配空间,但是除第一维可以为变量外,其它维数都必须是常量
注意在使用delete时,不用考虑数组的维数。 有时,并不能保证一定可以从堆内存中获得所需空间,当不能成功地分配到所需要的内存时,new返回0,即空指针。因此我们可以通过判断new的返回值是否为0,来得知系统中是否有足够的空闲内存来供程序使用
例子
1
2
3
4
5
|
int *p= new int[100];
if(p==0) {
cout<<“can’t allocate more memory,terminating."<<endl;
exit(1);
}
|
一维数组
1
2
3
4
5
|
// 动态分配,数组长度为 m
int *array=new int [m];
//释放内存
delete [] array;
|
二维数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <iostream>
using namespace std;
int main()
{
int **p;
int i,j; //p[4][8]
//开始分配4行8列的二维数据
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;
}
|
三维数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
int ***array;
// 假定数组第一维为 m, 第二维为 n, 第三维为h
// 动态分配空间
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;
|