new / delete如何存储有关分配的缓冲区的内部信息?

时间:2014-12-09 09:02:58

标签: c++ memory allocation

我正在使用C ++ new / delete运算符来分配/释放缓冲区。我认为对于每个分配的缓冲区,应该有一个额外的信息块存储大小和缓冲区的其他信息。如何了解有关此信息块的更多详细信息?我需要覆盖这两个运算符,并发现这样的信息块对我的实现很有用。

由于

2 个答案:

答案 0 :(得分:1)

首先,您无法了解此信息。在C ++中使用动态数组时, 负责分别跟踪分配的大小。这是任何人都不应该使用动态数组的主要原因之一,而只是使用std::vector代替跟踪大小,以便您不会丢失或将其与其他人混淆。大小或忘记更新它。

现在问题是尺寸是否存储在内部某处。那要看。如果您只是从malloc获取内存并将其传递给free,则您不需要知道已分配的大小,因为内存分配器已经在内部无形地跟踪您的信息。 C ++需要知道数组元素数量的唯一原因是为了调用所有正确的析构函数。因此,只有在数组元素对象不能轻易破坏的情况下,才需要大小信息。

至少Itanium ABI for C ++不存储任何额外的大小信息,除非这些对象不是简单的可破坏的。其他ABI可能有所不同。但无论你怎么回事,你都无法知道。

总结:使用std::vector

(请注意std::vector没有隐藏成本,因为它内部不包含本机动态数组,而是直接管理所有元素。就像它需要的动态数组一样跟踪元素的数量,但与动态数组不同,它使这个数字对用户公开可见。对我来说,这是一个更多的迹象表明动态数组在库中比在核心语言中更好地解决。)

答案 1 :(得分:0)

您在寻找有关缓冲区的哪些信息?如果您有这样的事情:

int* ptr = new int[size];

您知道缓冲区的大小以及缓冲区存储的变量类型。

如果您希望缓冲区增大或缩小,请使用另一个响应中所述的向量。