【发布时间】:2018-10-08 16:53:39
【问题描述】:
我正在实现一个堆栈分配器,并为某个类重载了operator new[] 以使用我自己的分配器。然后我注意到operator new[] 为分配的数组中的元素数量分配了内存。
比如:
test_class* test_arr = new test_class[5];
从我的分配器请求 8 个字节 + 5*sizeof(test_class) 并在前 8 个字节中存储数组的大小,在本例中为 5。
为什么要这样做?我的分配器的工作是跟踪分配的内存量。对于那部分,它真的没有意义,不是吗?那么有什么意义呢? 另外,我可以(或不应该?)以某种方式“关闭它”吗?
【问题讨论】:
-
分配器通过存储大小和分配的内存来跟踪分配的内存。查看
operator delete[]的代码。 -
@MustafaOzturk 在 libstdc++ 中
delete仅将void*传递给std::free。因此,在我的示例中,它将传递一个指向第一个test_class元素的指针。free对指针的类型一无所知,那么为什么数组中的元素数量会带来好处呢? -
我不是专家,但我认为如果你的类有一个重要的析构函数,delete[] 需要知道要调用多少个元素
-
delete[]不是delete。要在 C++ 中释放数组,您需要使用delete[]。因此,要正确删除上述分配,您必须调用delete[](test_arr)。 -
operator new[]存储数组中的对象数量,以便operator delete[]知道必须销毁多少对象。
标签: c++ dynamic-memory-allocation