Mik*_*yke 2 c++ dynamic-memory-allocation
我正在实现一个堆栈分配器并重载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,编译器为N数组中p指向的每个元素调用析构函数,然后调用operator delete[]以释放它从中获得的内存operator new[]。
但N并不总是具有相同的价值。你可以这样做p = new T[3]; delete[] p; p = new T[4]; delete[] p;,两次删除将分别运行不同数量的析构函数。
为了调用正确数量的析构函数,必须在某处记录下p指向的数组中有多少对象。该注释通常存储在编译器从调用operator new[]. 这就是为什么它需要额外的空间。
这是当今的典型实现,但编译器不需要这样做。例如,至少有一个早期实现保留了一个单独的指针值和析构函数计数表。
此外,许多实现不会为没有析构函数的类型使用额外的开销。所以int *p = new int[3]会简单地调用operator new(3*sizeof(int),并且delete[] p会简单地调用operator delete(p)。