C++|array new 和 array delete的堆内存细节

在C中, 堆内存的申请与释放通过malloc()和free()来进行,而对于C++,其运算符函数new、delete不但封装了malloc()和free(),还增加了一些额外的操作,来得更安全和便捷。

C++|array new 和 array delete的堆内存细节


C++|array new 和 array delete的堆内存细节

C++的new、delete与C的maoolc()、free()在array操作时有所不同,array new需与array delete匹配,也就是一个new []必须匹配delete []。

delete→释放整块内存,即使是new的动态对象数组。

delete[]→① 释放整块内存,即使是new的动态对象数组。② 释放每个对象中指针成员指向的堆内存。

所以有new指针成员指向堆内存的类对象数组,不仅需要big three,还需要delete[]。而对于没有指针成员指向堆内存的类对象,则可以使用默认的big three,即使new一个动态对象数组,也可以将delete[]写成delete,但为了统一规范即避免意外考虑,对于new出的动态对象数组,统一配对delete[]为最佳考虑。

C++|array new 和 array delete的堆内存细节

由由图可知,申请n个字节的内存,给出的内存还有额外部分,在这个内存块的头尾位置用一个字节来存储这个内存块的大小,如果申请动态数组,还有一个字节存储某种数据类型的数量(数组元素数量)。此外,如果是Debug模式,还包含了32字节用来构建Debugger Header,用作调试信息。当然,还会考虑内存对齐,通过牺牲空间来获取时间,以有更快的字节访问速度。

delete[]:

C++|array new 和 array delete的堆内存细节

上述封装了指针的类,当new这样的类的对象数组时,对于C语言来说,相当于是要构建一个二维动态数组,具体细节请见:C|三种方法创建二维动态数组,通常需要用一个循环来free()多个指向堆内存的指针。而对于C++的delete,则只需增加一个[]即可告知编译器,这里释放的是一个动态数组,需要释放掉每个指针指向的堆内存块。

ref

https://www.bilibili.com/video/BV1aW411H7Xa?p=8

-End-


分享到:


相關文章: