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在释放空间前会调用析构函数完成空间中的资源的清理

 

内存泄漏是指针丢失了?还是内存丢失了?

指针丢了。找不到指针去释放空间。

 


 

若本篇对您有所帮助,希望能获得您的赞!

 

posted @   lemon-Breeze  阅读(184)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示