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在释放空间前会调用析构函数完成空间中的资源的清理
内存泄漏是指针丢失了?还是内存丢失了?
指针丢了。找不到指针去释放空间。
若本篇对您有所帮助,希望能获得您的赞!

C++内存管理 new+delete
浙公网安备 33010602011771号