【C++初阶】:动态管理

前置知识(堆区):c语言动态内存
额外知识:栈区

在这里插入图片描述

一.new和delete(一般使用)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对于自定义类型

在这里插入图片描述

对多个自定义类型创建时,必须进行初始化,如果不想初始化,那么就得给缺省值。

扫描二维码关注公众号,回复: 15239889 查看本文章

在这里插入图片描述

注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与
free不会。

二.operator new与operator delete函数(底层)

这两个函数不是简单的对new和delete进行运算符重载,它们其实是全局函数。下面是两个库函数的实现代码(看不懂很正常)

在这里插入图片描述

简单使用一下

在这里插入图片描述

1.new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间

2.通过上述两个全局函数的实现知道,operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的。

用法

在这里插入图片描述

三.new和delete的实现原理

内置类型

在这里插入图片描述

自定义类型

在这里插入图片描述

四.定位new(placement-new)

1.定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。 使用格式: new (place_address)
type或者new (place_address) type(initializer-list)
2.place_address必须是一个指针,initializer-list是类型的初始化列表 使用场景:
定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。

注意这里并不是new,而是new的另一个用法,可以显示调用构造函数

在这里插入图片描述
在这里插入图片描述

插个小知识,这里也必须显示调用析构函数,因为p1是指针,属于内置类型不会自动调用析构函数。

五.malloc和new的区别

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_73790767/article/details/130642842