动态管理
- 一.new和delete(一般使用)
- 二.operator new与operator delete函数(底层)
- 三.new和delete的实现原理
- 四.定位new(placement-new)
- 五.malloc和new的区别
前置知识(堆区):c语言动态内存
额外知识:栈区
一.new和delete(一般使用)
对于自定义类型
对多个自定义类型创建时,必须进行初始化,如果不想初始化,那么就得给缺省值。
注意:在申请自定义类型的空间时,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是指针,属于内置类型不会自动调用析构函数。