浅谈new/delete
程序员文章站
2022-07-14 18:25:42
...
在C语言的学习中,我用知道动态内存开辟是使用malloc函数来进行开辟一段连续的空间,释放则是用free来进行释放,而学习了C我们知道,在C中开辟内存是使用new,释放则也与之对应的delete,下面我们就来说说malloc/free与new/delete之间的区别以及底层实现原理
回顾
在C语言库中函数原型如下
#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
malloc/free使用
int *p = (int*)malloc(sizeof(int)); //指向整型的指针p指向一个大小为100字节的内存的地址
if(p == NULL) //使用之前一定要判断释放申请成功
{
printf("application memory error");
}
free(p); //释放
与之还以两个函数
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
void *reallocarray(void *ptr, size_t nmemb, size_t size);
calloc 函数和malloc的区别就是申请好空间会初始化成0,另外calloc函数在使用时需要传入元素个数和元素字节大小
recalloc函数用于修改一个原先已经分配好的内存块的大小,可以使一块内存扩大或缩小,如果扩大内存,则原来的内存块保持不变,在内存尾部增加新的内存块,且不进行初始化。如果缩小内存,则原来内存块从尾部进行删减。如果原先的内存块无法扩充,则新开辟一块内存,并复制原先的内存的内容,原先内存块失效无法再进行访问。
new/delete使用
int *p = new int; //在*存储区中分配创建了一个整形对象,并返回一个指向该对象的地址来初始化指针p
int *p = new int(); //对指针p指向的地址的值进行了初始化为0
int *P = new int(1024);//初始化为1024
当动态创建的对象用完后必须释放内存,避免造成内存泄漏,可以用delete来完成,new和delete是成对使用的,如下命令释放p指向的int型对象所占用的内存空间:
delete p
p = NULL;
C++中允许动态创建const对象
const int *p=new const int(1024); //动态创建的const对象必须进行初始化,并且进行初始化后的值不能再改变。
new[]/delete[]使用
当创建一个动态数组对象和进行内存释放时,执行以下语句:
int *p=new int[]; //指针p所指向的数组未初始化
int *p=new int[n]; //指针p指向长度为n的数组,未初始化
int *p=new int[](); //指针p所指向的地址初始化为0
delete [] p; //回收p所指向的数组
它们之间的区别
new/delete原理
new[]/delete[]原理