C++自定义类定义析构函数时new[]分配数组出现额外字节问题咨询
C++
new[] 运算符额外分配内存的原因 本质为数组元素计数开销
你观察到的额外8字节是数组元素数量存储开销,是C++编译器的通用实现逻辑:
- 当类拥有非平凡析构函数时,执行
delete[]需要逐个调用数组中每个对象的析构函数,编译器必须提前知道数组的元素总数,因此会在new[]分配的内存块开头额外开辟空间存储这个计数。 - 你使用的是64位编译环境,该计数占用8字节存储空间,加上4个
Example对象本身的16字节(每个占4字节),总大小刚好是24字节,和你的输出完全吻合。
注释析构函数后分配大小恢复的原因
当你删除自定义析构函数后,Example类的析构函数变为平凡析构,编译器可以判定销毁对象时不需要执行任何额外操作,delete[]时不需要逐个调用析构函数,自然就不需要存储数组元素计数,因此只会分配16字节的对象实际占用空间。
补充说明
该计数存储的实现不属于C++标准强制规定的内容,但GCC、Clang、MSVC等主流编译器均采用该逻辑:32位编译环境下计数会占用4字节,此时你观测到的额外开销就会变为4字节,总分配大小为20字节。该计数存储在整个数组内存块的头部,位于你拿到的数组指针指向地址的前方,和每个对象内部的虚函数表指针完全无关,这也符合你添加虚函数后仅每个对象增加8字节、原有额外8字节仍存在的测试结果。你可以通过GDB查看p_example - 8地址处的内容,会发现存储的值刚好为4,就是你申请的数组元素数量。
内容的提问来源于stack exchange,提问作者kerbal22
相关产品推荐
相关产品推荐

