new的分解动作
![new、delete、[]new、[]delete new、delete、[]new、[]delete](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVGMxT1Rjek55OHlNREl4TURFdk1UYzFPVGN6TnkweU1ESXhNREV4TlRBd01EWXhNRGMxTVMweE9Ea3pNVFE1TkRBMUxuQnVadz09)
- new关键字调用operator new
- operator new调用malloc
- 强制转换
- 调用构造函数(这也是为什么malloc不能申请包含指针的类内存的原因)
- PS:new关键字是表达式,固定形式;operator new才可以重载
delete的分解动作
![new、delete、[]new、[]delete new、delete、[]new、[]delete](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVGMxT1Rjek55OHlNREl4TURFdk1UYzFPVGN6TnkweU1ESXhNREV4TlRBd01EZzFNekEwTkMweE1UTXdORFU1TnpNMkxuQnVadz09)
- delete关键字
- 调用析构函数
- delete关键字调用operator delete
- operator delete调用free
malloc分配的内存并不只是你申请的大小
![new、delete、[]new、[]delete new、delete、[]new、[]delete](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVGMxT1Rjek55OHlNREl4TURFdk1UYzFPVGN6TnkweU1ESXhNREV4TlRBd01UYzBPVFF4TUMwNU5qQXhNRE0xTnpRdWNHNW4=)
- pad是内存对齐
- 上下粉色是cookie,记录分配内存的信息,操作系统用于回收内存
[]new一定要用[]delete,否则可能会发生内存泄漏
![new、delete、[]new、[]delete new、delete、[]new、[]delete](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVGMxT1Rjek55OHlNREl4TURFdk1UYzFPVGN6TnkweU1ESXhNREV4TlRBd01UazBNakF6TXkweE1EYzJOREUxT0RBMkxuQnVadz09)
![new、delete、[]new、[]delete new、delete、[]new、[]delete](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVGMxT1Rjek55OHlNREl4TURFdk1UYzFPVGN6TnkweU1ESXhNREV4TlRBd01qSTBPVFl3TUMweE1UTTROemd3TkRnNExuQnVadz09)
- []new会分配多四个字节,记录n个对象
- delete使用[]才会读取记录,调用n次析构函数
- delete不使用[],只调用1次析构函数
-
注意:并不是malloc这一块的内存发生泄漏,而是调用构造函数的对象发生了内存泄漏
- 如果[]new不需要调用构造函数分配内存,那么即使使用delete也不会发生内存泄漏,但是最好也要匹配使用
相关文章:
-
2021-05-13
-
2021-07-29
-
2021-05-19
-
2021-12-12
-
2021-10-30
-
2022-03-02
猜你喜欢
-
2021-06-02
-
2021-10-15
-
2021-11-10
-
2022-12-23
-
2022-02-15
-
2021-07-16
-
2021-04-20