目录
3.new与malloc、delete与free的区别与联系
1.new
1.1作用
开辟一块空间,如果开辟失败,就直接报异常。功能性和malloc一样(开空间)。
1.2格式
注:类型分为内置类型和自定义类型。区别就是自定义类型会调用构造。
注:如果数量只有一个,那么数量不需要写,初始化用 “()”。
如果数量是两个以上,那么数量需要用“[ ]”里面填写,初始化用“{ }”。
注:如果我们一个也不初始化,编译器就会存随机值。
如果初始化了哪怕1个,剩下的也会初始化为0。
2.delete
2.1作用:
释放一块空间,如果失败就会报异常。功能性与free一样(释放空间)。
2.2格式:
3.new与malloc、delete与free的区别与联系
对于内置类型:new(delete)是malloc(free)的plus版本。
对于自定义类型:new(delete)是malloc(free)的plus plus版本。至于为什么是两个plus,我们接下来了解。
3.1首先了解operator new函数和operator delete函数:
new和delete是用户进行动态内存申请和释放的操作符,operator new 和 operator delete 是系统提供的全局函数,new在底层调用operator new来申请空间,delete在底层通过operator delete 来释放空间。
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,如果用户设置了措施,则继续申请,否则抛异常。
3.2为什么内置类型是plus,自定义类型是plus plus
1.内置类型:new和malloc,delete和free基本相似,不同的地方在于,new(delete)申请和释放的是单个元素的空间,new[ ]和delete[ ]申请和释放的是连续空间,可以控制了。而且申请空间失败会抛异常,malloc会返回NULL。
总结一句话就是:可以控制的更精准了,不需要检测 申请空间 失败了,会抛异常(plus的地方)。
2.自定义类型:
总结一句话就是:如果申请空间失败,会抛异常(第一个plus),自动调用构造和析构(第二个plus)
3.3一些细节的区别:
共同点:malloc/free/new/dlelte都是从堆上申请空间,并且需要用户手动释放。
不同的地方是:
- malloc和free是函数。new和delete是操作符。
- malloc申请的空间不会初始化。new可以初始化。
- malloc申请空间时,需要手动计算空间大小并传递。new只需在其后面跟上类型、数量即可
- malloc返回值是void *,需要强制类型转换。new不需要。
- malloc申请空间失败时,返回的是NULL,需要判断。new不需要,但是new需要捕获异常。
- 申请自定义类型时,malloc/free只会开辟空间,不会调用构造和析构。new不仅会开空间,还会自动调用构造和析构。
4.关于sizeof的结果,可能多4B的解释:
我们会看见,开p2空间的时候,是84.而不是80,多开了4B的空间。为什么?
我们又会发现,这4B 又消失了。
至于为什么是4B,为什么要有这个东西,至于构造有没有多开4B。我就不太了解了......
5.定位new表达式(了解)
5.1作用:
可以显示调用构造函数。
实践价值:只有在池化技术中,提高系统的效率,才会用定位new。一般别的场景也不会用,系统已经帮我们做的很好了。
5.2定义:
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。
5.3使用格式:
new(place_address) type 或者 new(place_address) type(initializer-list)
place_address 必须是一个指针,initializer-list是类型的初始化列表。
5.4使用场景:
定位new表达式在实际中一般是配合内存池使用。因为内存是分配出的内存没有初始化,如果是自定义类型的对象,需要使用new 的定义表达式进行显示构造函数进行初始化。
标签:初始化,malloc,--,plus,空间,new,delete From: https://blog.csdn.net/2301_79202899/article/details/144142105