c++ 动态内存管理 new/delete

c语言是通过使用malloc、calloc、realloc、free进行内存管理
malloc:直接开辟空间
calloc:开辟空间时会进行初始化
realloc:它的函数原型为”void *realloc(void *ptr,size_t size)”,当参数 *ptr为空时,realloc等价于malloc;realloc可用于扩容,需要重新开空间。
c++中使用new、delete来动态管理对象

void test{
int *p1 = new int;//动态分配1个int的空间大小
int *p2 = new int(3);//动态分配1个int的空间,并初始化为3
int *p3 = new int[3];//动态分配3个int的空间,即12个字节
delete p1;//使用delete对new开辟的空间进行释放
delete p2;
delete[] p3;
}

new/delete和malloc/free要彼此对应使用,若乱用会造成内存泄漏;这两组的区别在于:
1)malloc/free是c语言中的函数,而new/delete是c++中的操作符;
2)new/delete不需要头文件支持,malloc/free需要;
3)它们都是动态内存管理的入口;
4)new建立的是一个对象,通过成员函数访问;malloc得到的是一块内存,通过指针访问;
5) malloc/free要手动计算类型大小且返回值是void*,new/delete可自己计算类型大小,返回对应类型的指针。
6)使用new时不仅是动态分配内存,还有调用构造函数进行初始化,delete不仅释放内存还会调用析构函数进行成员清理;而malloc/free只是进行内存分配和释放;

c++中还有如下的动态内存分配接口:
void * operator new (size_t size);
void operator delete (size_t size);
void * operator new [](size_t size);
void operator delete[] (size_t size);
可以看出operator new/delete和new/delete的区别:前者是函数,后者只是操作符。

new操作符的执行过程是:
a)调用operator new分配空间;
b)调用构造函数初始化对象;
c)返回对应指针。

delete操作符的执行过程是:
a)调用operator delete释放空间;
b)调用析构函数清理对象。

operator new/operator delete类似c语言中的malloc/free,只负责分配和释放空间,不钓鱼其他函数,但使用operator new分配的空间必须使用operator delete释放。
operator new/operator delete和operator new[]/operator delete[]都可以重载,而new操作符不行。
operator new重载时返回类型要声明为void*,第一个参数类型是要分配空间的大小,且重载时可以带其他参数。如果类中没有重载operator new,就要调用的全局的::operator new来完成堆的分配。

使用new分配数组,如A *p4 = new A[3]; 会直接调用全局的operator new[](size_t size),不管A中是否有operator new[]的重载;而delete[]p却会优先调用A::operator delete(如果A中有重载),
还需注意的是在operator new[](size_t size)中传入的并不是sizeof(A)*3,是要在对象数组的大小上加上一个数据大小,用于编译器区分对象数组指针和对象指针以及对象数组大小,通常这个数据占4个字节,为一个int大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值