new/delete , new/delete[] , malloc/free区别

本文深入探讨C++中new/delete与malloc/free的区别,包括构造与析构函数的调用、内存分配机制及不当使用可能导致的问题。new/delete不仅管理内存,还涉及对象初始化与清理,而malloc/free仅负责内存分配与释放。
摘要由CSDN通过智能技术生成

原文地址
本文是上面那篇总结了,再加上了一点点自己的体会

(i)malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员);
(ii)malloc/free是C/C++标准库的函数,new/delete是C++操作符;
(iii)new表达式并不直接开辟内存出来,而是通过调用operator new来获得的内存,而operator new获得的内存实质上还是用malloc开辟出来的。它们只是malloc和free的一层封装;
(iv)delete[]实际做了这样几件事情:依次调用指针指向对象数组中每个对象的析构函数;调用operator delete,它将再调用operator delete;底层用free执行operator delete表达式,依次释放内存;
【注】:这就是为什么在析构函数中再次调用delete[]时候会报错了。因为释放多了内存
(v)AA* pA = new AA[10];中,new最后将开辟好内存用指针p返回,pA接收它。p 和pA 会差上4字节的原因:
编译器用相差的这4个字节用来保存对象个数,然后返回该处地址。
【注】:在delete[] 的时候,不用传给它对象个数的原因。而且new type[] ,只有type显示定义析构函数时,编译器才会多开4字节来保存对象个数。所以像new int、char这样的内置类型编译器不会多开这4字节,编译器自行优化。

(vi)delete, delete[] 之间不能误用,不然会导致内存泄漏。
本来该用delete[],用错:
New AA []本来多开辟了4个字节空间,但delete认为不存在,会直接从该处释放,导致这多余的四个空间未释放。
本来该用delete,用错:
这次本来没开辟4字节,造成非法访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值