动态分配内存
C++动态内存
C++程序中内存分为两个部分
- 堆:程序中未使用的内存,在程序运行时可用于动态分配内存。
- 栈:函数内部申明的所有变量都将占用栈内存。
很多时候不知道一个程序到底需要多少内存,可以在程序运行时使用关键字new动态分配内存,这会返回所分配的空间地址。当不在需要分配的内存时可以使用delete进行删除。
动态内存分配方式
1. new与delete
用法:
类型名 *指针变量 = new 类型名;
类型名 *指针变量 = new 类型名[元素个数];
int *p = new int; //指向int型的指针
int *pArr = new int[len]
使用new时自由存储区可能已经被用完,因此最好检查是否分配成功。
int *p = NULL;
if( !(p = new int) ){
cout<<"ERROR"<<endl;
exit(1);
}
delete的用法
delete p;
delete []pArr; //删除内存块后强烈建议将指针指向NULL,避免其成为野指针。
pArr = NULL;
二维数组的动态内存分配
int **array; //假设维度为m x n array = new int *[m]; for(int i = 0; i < m;i++){ array[i] = new int array[n]; } //删除 for(int i = 0;i < m;i++){ delete []array[i]; } delete []array;
2.对象的二动态内存分配
#include<iostream> using namespace std; class Box{ public: Box(){ cout<<"构"<<endl; } ~Box(){ cout<<"析"<<endl; } }; int main(){ Box* b = new Box[5]; //构构构构构 delete []b; //析析析析析 return 0; }
2. malloc与free
malloc是编译器的内置函数,包含于头文件stdlib.h。
//malloc原型 void malloc(unsigned in size) //free原型 void free(void* p) //malloc用法 int *p = (int*)malloc(sizeof(int)*len); for(int i= 0;i < len;i++){ cin>>*p; } //free用法 free(p);
- 使用new关键字时不仅开辟了内存,还创建了对象,特别是对类使用时自动调用构造函数,delete时自动调用析构函数。而malloc对类使用时只会开辟内存空间,不会对类自动进行初始化,free时也不会清理成员函数的
- malloc&free是标准库函数,new&delete是C++关键字。
- malloc&free需要手动计算大小,返回值为void*。new&delete自动计算类型的大小,返回对应类型的指针。
- malloc&free分配内存失败会返回0。new&delete分配失败时会抛出异常。
参考链接: