如果定义的变量或对象在程序运行时才能确定,编译器在编译时就无法为它们预先分配存储空间。
栈:在函数内部声明的所有变量都将占用栈内存。
堆:程序中未使用的内存,在程序运行时可用于动态分配内存。
在C++中,动态分配内存可以保证程序在运行过程中根据实际需要申请适量的内存,使用结束后还可以释放。
new 和 delete 运算
new运算的作用: 按照指定类型和大小动态地分配内存,并且返回所分配的空间地址。形式如下:
指针变量 = new 类型名(初值列表);
如果创建成功,返回对象的地址,否则返回空指针NULL。所以建议检查new运算是否返回NULL指针,操作举例如下:
int *d = new int(5);
if (d == NULL)
{
cout << "Error: out of memory." << endl;
exit(0);
}
new运算不仅分配了内存,还创建了对象,但是对象未命名。
使用new运算创建同类型的多个对象——数组时,格式如下:
指针变量 = new 类型名[下标表达式];
例如,动态创建一维数组如下:
int *d = new int[5];
动态创建多维数组如下:
指针变量 = new 类型名T [下标表达式1][下标表达式2][...]
其中:
①只有下标表达式1可以是任意正整数的表达式,而其他下标表达式必须是值为正整数的常量表达式。
②new 运算返回一个指向新分配内存首地址的指针,它是一个T类型数组的指针,而不是T类型指针。
delete 运算的作用: 释放用new运算申请分配的内存空间。形式如下:
delete 指针变量名;
如果删除的是动态数组,格式如下:
delete[] 指针变量名;
注意:
①此时释放了指针所指的内存空间,但是指针本身仍然存在。
②delete语句中的方括号是非常重要的,如果没有方括号,则只回收第一个元素所占的空间。
程序代码1(创建二维数组):
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
int m, n;
int **d;
cout << "输入矩阵的大小:";
cin >> m >> n;
d = new int *[m]; //申请m行
if (d == NULL)
{
cout << "申请空间失败..." << endl;
exit(0);
}
for (int i = 0; i < n; i++)
{
d[i] = new int[n]; //为每行申请n列
if (d[i] == NULL)
{
cout << "申请空间失败..." << endl;
exit(0);
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> *(*(d + i) + j);
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cout << d[i][j] << "\t";
}
cout << endl;
}
return 0;
}
运行结果:
程序代码2(创建多维数组):
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
int ***d;
int m, n, h;
cout << "输入三维数组的大小:";
cin >> m >> n >> h;
d = new int **[m]; //申请m维
if (d == NULL)
{
cout << "申请空间失败..." << endl;
exit(0);
}
for (int i = 0; i < m; i++)
{
d[i] = new int *[n]; //申请n行
if (d[i] == NULL)
{
cout << "申请空间失败..." << endl;
exit(0);
}
for (int j = 0; j < n; j++)
{
d[i][j] = new int[h]; //申请h列
if (d[i][j] == NULL)
{
cout << "申请空间失败..." << endl;
exit(0);
}
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < h; k++)
{
*(*(*(d + i) + j) + k) = 100 * i + 10 * j + k;
}
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < h; k++)
{
cout << d[i][j][k] << "\t";
}
cout << endl;
}
cout << endl;
}
//释放内存
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
delete[] d[i][j];
}
}
for (int i = 0; i < m; i++)
{
delete[] d[i];
}
delete[] d;
return 0;
}
运行结果如下: