C++内存管理
C++内存管理
先了解C语言三个开空间的区别 分别是 malloc、calloc、realloc
malloc是开空间 calloc开空间+初始化 realloc在原来的空间增加空间(分为原地扩和异地扩,这取决于内存分配)
C++的开空间是 new
对于内置类型而言 用malloc和new 除了用法不同,他们都是相同的
他们的区别在于自定义类型 不同
malloc开自定义类型 只是单纯的开空间 而new 开空间+调用构造函数
delete和free的区别
free是单纯的释放空间 而delete是调用析构函数+释放空间
先构造全局对象,在构造局部静态对象,最后才构造普通对象,然而析构对象的顺序是完全按照构造的相反顺序进行的
这是new自定义类型的过程图
这是delete的过程图
总结:new、delete与malloc、free的区别在于 new会调用构造函数 delete会调用析构函数 而malloc和free不会,new先开自定义类型的空间,在调用构造函数,delete先调用析构函数,清理类中的资源,在对自定义类型进行释放。他们两个是相反的顺序
new和malloc失败处理方式不同
malloc失败返回空指针,需要自行检查,new失败,抛异常
operator new与malloc的功能是一样的,但operator失败会抛异常,operator new是封装了malloc 加了个抛异常,为了让new去调用它
new的底层原理:
去调用operator call operator
去调用相对应的构造函数 call Stack::stack(这里用Stack举例)
new=operator new+构造函数
自定义类型
new原理
调用operator new函数申请空间 在申请空间上执行构造函数,完成对象的构造
delete原理
在空间上执行析构函数 在operator delete函数释放对象的空间
new[] 原理
调用operator new函数 在operator new[]中调用operator new函数完成N此对象空间申请, 在申请空间上执行N此构造函数
delete []原理
在释放的对象空间上执行N此析构函数 完成N个对象中资源的清理
调用operator delete[]释放空间 实际在operator delete[]中调用operator delete来释放空间
定位new表达式
定位new表达式时在已分配的原始内存空间中调用构造函数初始化一个对象
new(obj)stack(4)
对象名 类型 初始值
使用场景:一般配合内存池使用,因为内存池分配出来的空间内存没有初始化,所以如果是自定义类型的对象,需要使用定位new显示调用构造函数进行初始化
面试题
malloc、free和new、delete的区别
malloc、free和new、delete的共同点都是从堆上申请空间,并且需要手动释放。
不同点:
1.malloc和free是函数 new、delete是操作符
2.malloc申请的空间不会初始化,new可以调用构造函数初始化
malloc申请空间时,需要手动计算空间大小并传递,new只需要在其后跟上空间的类型即可,如果是多个控件 【】中指定对象个数即可
4.malloc的返回值是void* 在使用时必须强转,new'不需要 因为new后跟的是空间的类型
5.malloc申请空间失败时,返回的是NULL 因此使用时必须判断,new不需要,但new需要捕获异常
6.申请自定义对象时,malloc和free只会开空间,不会调用构造函与析构函数,而new在申请空间后会调用构造函数完成对象初始化,delete在释放空间前会调用析构函数完成空间中的资源的清理
内存泄漏是指针丢失了?还是内存丢失了?
指针丢了。找不到指针去释放空间。
若本篇对您有所帮助,希望能获得您的赞!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具