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

new/delete如何存储有关已分配缓冲区的内部信息? < >我使用C++新/Delphi运算符分配/释放缓冲区。我认为对于每个分配的缓冲区,应该有一个额外的信息块来存储缓冲区的大小和其他信息。如何了解有关此信息块的更多详细信息?我需要重写这两个操作符,并发现这样的信息块对我的实现很有用,c++,memory,allocation,C++,Memory,Allocation,谢谢首先,您无法知道此信息。当您在C++中使用动态数组时,您有责任单独跟踪分配的大小。这是一个主要原因,任何人都不应该使用动态数组,而应该使用std::vector,它为您跟踪大小,这样您就不会丢失它或将它与其他人的大小混淆,或者忘记更新它 现在的问题是大小是否存储在内部某个位置。那要看情况。如果您只是从malloc获取内存并将其传递给free,则不需要知道分配的大小,因为内存分配器已经在内部跟踪此信息,对您来说是不可见的。唯一的原因是C++需要知道数组元素的数量,以便调用所有的右析构函数。因此

谢谢

首先,您无法知道此信息。当您在C++中使用动态数组时,您有责任单独跟踪分配的大小。这是一个主要原因,任何人都不应该使用动态数组,而应该使用
std::vector
,它为您跟踪大小,这样您就不会丢失它或将它与其他人的大小混淆,或者忘记更新它

现在的问题是大小是否存储在内部某个位置。那要看情况。如果您只是从
malloc
获取内存并将其传递给
free
,则不需要知道分配的大小,因为内存分配器已经在内部跟踪此信息,对您来说是不可见的。唯一的原因是C++需要知道数组元素的数量,以便调用所有的右析构函数。因此,只有当数组元素对象不可破坏时,才严格需要大小信息

至少C++的ItAudii ABI不存储任何额外的大小信息,除非对象不是简单地可破坏的。其他ABI可能有所不同。但不管你怎么转,你都没办法知道

总之:使用
std::vector


(请注意,
std::vector
没有隐藏成本,因为它在内部不包含本机动态数组,而是直接管理所有元素。与动态数组一样,它需要跟踪元素的数量,但与动态数组不同,它使此数字对用户公开。对我来说,这是另一个指标。)在这一点上,动态数组在库中的求解要比在核心语言中的求解好得多。)

您需要关于缓冲区的哪些信息?如果您有类似的信息:

int* ptr = new int[size];
您知道缓冲区的大小以及缓冲区存储的变量类型


如果您希望缓冲区增长或收缩,请使用另一个回答中所述的向量。

不要连续问三个基本相同的问题,请合并为一个问题。