参考链接
动态内存处理
为什么会有这么一个概念呢?我们在写程序的时候,有的时候很难提前预知定义的变量需要申请多少内存,只有在程序运行的过程才能够确定。需要说明一点,在C++中内存由两部分组成:栈和堆。其中,函数内声明的所有变量使用栈来存储;对于程序未使用的可用于动态分配的内存则有堆完成。
要进行动态申请内存,C++提供了空间分配new运算符,还提供了删除分配的空间运算符delete。下面我们将从数据类型、数组、类对象的动态内存处理进行详细分析一下:
数据类型动态内存处理
直接在程序实例中学习:
#include <iostream>
using namespace std;
int main()
{
double *dData = new double; //数据类型的动态分配空间 new 数据类型
*dData = 5.6;
cout << *dData << endl;
delete dData; //释放申请的数据类型空间 delete 指针名
getchar();
}
运行结果
5.6
数组动态内存处理
#include <iostream>
using namespace std;
int main()
{
int *iArray1;
int **iArray2;
int ***iArray3;
/*一维数组处理*/
iArray1 = new int[5];
for (int id = 0; id < 5; id++) //想分配的数组内存复制
{
iArray1[id] = id;
cout << iArray1[id] << " ";
}
delete[] iArray1; //释放分配的内存
cout << endl << endl;
/*二维数组处理*/
iArray2 = new int *[5];
for (int id = 0; id < 5; id++)
iArray2[id] = new int[2];
for (int idx = 0; idx < 5; idx++) //想分配的数组内存复制
{
for (int idy = 0; idy < 2; idy++)
{
iArray2[idx][idy] = idx + idy;
cout << iArray2[idx][idy] << " ";
}
cout << endl;
}
for (int id = 0; id < 5; id++) //释放分配的内存(在这里一层层的释放)
delete[] iArray2[id];
delete[] iArray2;
cout << endl;
/*三维数组处理*/
iArray3 = new int **[3];
for (int idx = 0; idx < 3; idx++)
{
iArray3[idx] = new int *[3];
for (int idy = 0; idy < 3; idy++)
iArray3[idx][idy] = new int [3];
}
for (int idx = 0; idx < 3; idx++) //想分配的数组内存复制
{
for (int idy = 0; idy < 3; idy++)
{
for (int idz = 0; idz < 3; idz++)
{
iArray3[idx][idy][idz] = idx + idy + idz;
cout << iArray3[idx][idy][idz] << " ";
}
cout << endl;
}
cout << endl;
}
for (int idx = 0; idx < 3; idx++) //释放分配的内存
{
for (int idy = 0; idy < 3; idy++)
delete[] iArray3[idx][idy];
delete[] iArray3[idx];
}
delete[] iArray3;
getchar();
}
运行结果
0 1 2 3 4
0 1
1 2
2 3
3 4
4 5
0 1 2
1 2 3
2 3 4
1 2 3
2 3 4
3 4 5
2 3 4
3 4 5
4 5 6
类对象动态内存处理
这里其实在前面讲解类的时候已经使用过,下面我在使用简单程序看一下:
#include <iostream>
using namespace std;
class printClass
{
public:
printClass();
~printClass();
void printInfo()
{
cout << "天眼工作室" << endl;
}
private:
};
printClass::printClass(){}
printClass::~printClass(){}
int main()
{
printClass *printVar = new printClass(); //对象创建动态内存
printVar->printInfo();
delete [] printVar; //释放申请的对象空间
getchar();
}
运行结果
天眼工作室