了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分:
- 栈:在函数内部声明的所有变量都将占用栈内存。
- 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。
很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。
在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即 new 运算符。
如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。
malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。
#include<iostream> using namespace std; int main(){ //声明一个空指针 double *p=NULL; //将动态申请的空间的内存地址赋值给指针变量 p=new double; if(!p){ cout<<"申请失败"; } //赋值 *p=12312.123; //输出内存地址 cout<<p; //输出地址值 cout<<*p; //释放内存 delete p; return 0; }
字符串数组
char* pvalue = NULL; // 初始化为 null 的指针 pvalue = new char[20]; // 为变量请求内存 delete [] pvalue; // 删除 pvalue 所指向的数组
多维动态申请
#include<iostream> using namespace std; int main(){ //申明一个保存指针地址的指针 int **p=NULL; //动态申请一个指针数组 p = new int *[5]; //p指向第一个指针变量 for(int i=0;i<5;i++){ //第i个指针指向一个整形数组 p[i]=new int[3]; for(int j=0;j<3;j++){ //该数组赋值 p[i][j]=j; } } for(int i=0;i<5;i++){ for(int j=0;j<3;j++){ //输出该变量 cout<<p[i][j]; } cout<<endl; } for(int i=0;i<5;i++){ //释放数组指针 delete [] p[i]; } //释放最大的指针 delete [] p; return 0; }
动态申请类实例
#include<iostream> using namespace std; class Test{ public: Test(){ cout<<"开始构造对象"; }; ~Test(){ cout<<"释放对象占用的内存"; } }; int main(){ Test *test = new Test[4]; delete [] test; return 0; }