动态分配内存
- 使用new/delete申请释放内存
- 类型名* 指针=new 类型名
- int* p=new int;
- delete p;
- 类型名* 指针=new 类型名
-
- 类型名* 指针=new 类型名[数组长度]
- int* ptr=new int[5];
- delete []p;
- 类型名* 指针=new 类型名[数组长度]
- 使用malloc/free申请释放内存
- 类型名* 指针=(类型名*)malloc(数组长度*sizeof(类型名));
- free(p);
- short* p=(short*)malloc(5*sizeof(short));
- free(p);
俩者区别:
- 属性
- new/delete 是c++关键字,需要编译器支持;malloc/free是库函数,需要头文件的支持。
- 参数
- 使用new操作符申请内存分配时无需指定内存块的大小,编译器会根据类型信息判断。而malloc则需要显示地指出所需内存地尺寸。
- 返回类型
- new操作符内存分配成功时,返回的是对象类型地指针,类型严格与对象匹配,无需进行类型转换,故new是符合类型安全性地操作符。
- malloc内存分配成功则是void*,需要通过强制类型转换将void*指针转换成我们需要的类型。
- 分配失败
- new分配失败时,会抛出bac_alloc异常;malloc分配内存失败时会返回NULL。
- 自定义类型
- new会先调用operator new函数,申请足够地内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete 函数释放内存(通常底层使用free实现)。
- malloc/free是库函数,只能动态地申请和释放内存,无法对自定义类型对象进行构造和析构工作
- 重载
- 因为new/delete是操作符,他调用opertor new/operator delete,他们可以被重载,在标准库里他有8个重载版本;而malloc/free不可以被重载。
- 内存区域
- malloc在堆上分配内存,但是new其实不能说是在堆上,c++中,对new申请内存位置有一个抽象概念,他为自由存储区,可以在堆上,也可以在静态存储区上分配。取决于oprator new实现细节。
记录学习点滴,如有违规请告知。