gpt4 book ai didi

c++ - operator new[] 为什么要为数组的大小分配内存?

转载 作者:行者123 更新时间:2023-11-30 02:20:10 24 4
gpt4 key购买 nike

我正在实现一个堆栈分配器,并为某个类重载了 operator new[] 以使用我自己的分配器。然后我注意到 operator new[] 为分配的数组中的元素数量分配了内存。
例如:

test_class* test_arr = new test_class[5];

从我的分配器请求 8 个字节 + 5*sizeof(test_class) 并且在前 8 个字节中它存储数组的大小,在本例中为 5。

为什么要这样做?跟踪分配的内存量是我的分配器的工作。对于那部分,它真的没有意义,是吗?那么有什么意义呢?另外,我能否(或不应该?)以某种方式“关闭它”?

最佳答案

当您在代码中编写 p = new T[N] 时,编译器会生成调用 operator new[] 的代码来为 N< 分配足够的内存 T 类型的对象加上它需要的任何簿记信息。当您随后调用 delete[] p 时,编译器会为 p 指向的数组中的每个 N 元素调用析构函数,然后调用operator delete[] 释放它从 operator new[] 获得的内存。

但是 N 并不总是具有相同的值。你可以做 p = new T[3];删除[] p; p = 新 T[4]; delete[] p;,这两个删除将分别运行不同数量的析构函数。

为了调用正确数量的析构函数,某处必须有一个注释,记录 p 指向的数组中有多少对象。该注释通常存储在编译器从调用 operator new[] 获得的内存的簿记部分中。这就是它需要额外空间的原因。

这是目前的典型实现方式,但编译器不需要那样做。例如,至少一个早期的实现保留了一个单独的指针值和析构函数计数表。

此外,许多实现不会为没有析构函数的类型使用额外的开销。所以 int *p = new int[3] 会简单地调用 operator new(3*sizeof(int),而 delete[] p 会只需调用 operator delete(p)

关于c++ - operator new[] 为什么要为数组的大小分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50069257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com