我在这里阅读How does delete[] "know" the size of the operand array?,在分配的内存之前,它会保存分配的内存量。我分配了一个整数数组,将每个元素设置为值15并检查堆。 首先,我分配了一个包含2个元素的数组:
x/8xw 134524932
0x804b004: 0x00000011 0x0000000f 0x0000000f 0x00000000
0x804b014: 0x00020ff1 0x00000000 0x00000000 0x00000000
和另外4个元素:
x/8xw 134524932
0x804b004: 0x00000019 0x0000000f 0x0000000f 0x0000000f
0x804b014: 0x0000000f 0x00000000 0x00020fe9 0x00000000
有几点我不明白:
1)值0x00000011
和0x00000019
如何定义分配的大小?
2)是否有空间分配额外的数组元素?
3)分配的内存中的值0x00020ff1
和0x00020fe9
是否与分配相关?
我在32位Ubuntu上使用gcc。
答案 0 :(得分:2)
通常不会为基元存储元素数,因为不需要调用析构函数。这是使用g ++在64位Linux上编译的示例。请注意,大多数new
实施都在malloc()
上分层。通常,malloc()
也存储一些元数据。您通常会在C ++存储的元数据之前看到它。
如果malloc()
也存储大小信息,有人可能会问为什么C ++需要存储元素的数量。理由是从工程角度来看,将C ++编译器/ ABI与底层内存分配实现耦合是一个坏主意。
当然,这完全取决于平台,获取此信息会调用未定义的行为。在不同的平台上,它可能会导致鼻子恶魔或其他恶魔行为,所以一定要有驱魔人。
#include <cstddef>
#include <iostream>
#include <cstdlib>
struct A {
A() : data(count++) {}
~A() {}
const std::size_t data;
static std::size_t count;
};
std::size_t A::count = 1000;
int
main() {
{
A *aa = new A[1234];
std::cout << "The size_t immediatly before an array of A objects: "
<< *((std::size_t *) aa - 1) << std::endl;
delete [] aa;
}
// Note that for fundamental types, there is no need to store the size, so it doesn't.
{
std::size_t *sa = new std::size_t[5678];
std::cout << "The size_t before an array of std::size_t objects: "
<< *(sa - 1) << std::endl;
delete [] sa;
}
}