【C++】内存管理

1.new/delete

上面是基本语法。

用new开辟自定义类型,十分方便。

new还有一个优势:new失败了以后会抛异常,不需要手动检查。

2.new与delete的底层

由operator new这一层抛异常。

delete一个自定义类型时,先调用析构函数,在调用operator delete。

3.new/delete提高

首先ptr1有4个字节,但ptr2有44个字节。多出来的四个字节存开的自定义类型的个数,让delete \[\]知道需要调用几次析构函数,前提是用户显式写了析构函数。如果用户没有写析构函数,编译器会进行优化,将那4个字节省掉,ptr2只有40个字节了!

所以,p1有40个字节而不是44个,因为无析构函数可调。

new delete/new\[\] delete \[\]/malloc free要匹配使用,如果不匹配就会出问题。

这里delete p1不会出现问题,delete p2程序会崩溃。

delete p2有两个致命的错误:(如果没有手动定义析构函数则不会报错)

1.没有正确调用析构函数,可能会内存泄漏。

2.内存释放的位置错了,动态开辟的内存不能从中间释放,应该向前偏移4个字节再释放。

总之一定要匹配使用,否则结果不确定。因为如果编译器不优化,没有定义析构函数也可能报错。

4.定位new

注意析构函数是可以直接调用的,但构造函数不可以,需要调用定位new。

定位new的作用:如果有一个空间需要显式调用构造函数,就用定位new。

5.new/delete与malloc/free的区别

c++几乎不需要扩容的函数。有了new之后,几乎放弃了malloc这个系列。

6.内存泄漏

相关推荐
ThornArmor3 分钟前
《向内深潜,向外飞掠》
c语言·开发语言·c++·vim·visual studio
传奇开心果编程4 分钟前
【仓颉语言基础语法学与练】第1课:从零开始
开发语言·学习·华为
j7~7 分钟前
【C++微服务项目开发脚手架】(环境篇)虚拟机 + Docker + MySQL/Redis/RabbitMQ/ES/etcd/FastDFS 全套配齐
linux·c++·ubuntu·docker·vmware·项目开发·微服务脚手架
君顾18 分钟前
本地AI错题纠正小程序:端侧推理与错题闭环实战
java·开发语言·错题
qq_1998868710 分钟前
第5板块·第4节:性能优化中的高级技巧
c++·人工智能·gpu算力
吠品10 分钟前
Python 写入 Excel 的两种主流方案实际用法总结
c语言·开发语言·算法
邪修king18 分钟前
Re:Linux 系统篇(三十一):库的制作与原理Chapter2:静态链接与程序加载 —— 从磁盘 ELF 到运行中进程的完整旅程
android·linux·运维·开发语言
geovindu19 分钟前
rust: Factory Method Pattern
开发语言·设计模式·rust·工厂方法模式·创建型模式
eybk19 分钟前
用Kivy制作手机相片分类局域网传送工具,还能传输数据库文件
开发语言·python
郝学胜_神的一滴21 分钟前
C++20模板元编程 04:变量模板 别名模板与模板Lambda实战
c++·visual studio