新[]保存哪些信息?

时间:2014-12-20 16:22:42

标签: c++ gdb

我在这里阅读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)值0x000000110x00000019如何定义分配的大小?
2)是否有空间分配额外的数组元素?
3)分配的内存中的值0x00020ff10x00020fe9是否与分配相关?

我在32位Ubuntu上使用gcc。

1 个答案:

答案 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;
    }
}