如何从C ++中过度分配的内存部分中获取数组的大小

问题描述

我想研究一下delete []如何知道它必须从内存中删除多少个元素。我发现num-elems-in-new-array-overalloc很清楚。 我知道实现是特定于编译器的,但是我这里的问题是从内存中获取数组的正确大小。我没有直接需要此功能,只是想更清楚地了解。 如num-elems-in-new-array-overalloc所述,可以通过过度分配内存来存储数组的大小。

char* tmp = (char*) operator new[] (WORDSIZE + n * sizeof(int));

然后,导出指向第一个数组元素的指针,并将元素数量存储在tmp指针中。

int* p = (int*) (tmp + WORDSIZE);
*(size_t*)tmp = n;

我的假设是,在将p指针递减两次的情况下(我假设WORDSIZE == sizeof(size_t)sizeof(size_t)== 8 Byte),我应该得到数组大小n。 我做了一个小例子over-allocation在这里我尝试获取数组大小,但是在10个数组元素的情况下,我不知何故得到了49,而不是40。

int* tmp = arr - 2;
std::cout << "Array size: " << *tmp << std::endl;

Address 0: 0x9efe70
Address 1: 0x9efe74
Address 2: 0x9efe78
Address 3: 0x9efe7c
Address 4: 0x9efe80
Address 5: 0x9efe84
Address 6: 0x9efe88
Address 7: 0x9efe8c
Address 8: 0x9efe90
Address 9: 0x9efe94
Array size: 49 <- In question

我对WORDSIZE或编译器中的实现的假设可能是错误的。我想念什么?我知道How does delete[] “know” the size of the operand array?,但是答案并不能真正满足我的问题。

对于repl.it有问题的人,请参见完整示例:

#include <iostream>

void printMemoryLayout(int *arr,int n) {
    for(int i = 0; i < n; ++i) {
        std::cout << "Address " << i << ": " << &arr[i] << std::endl;
    }
}

int n = 10;

int main() {
    int* arr = new int[n];

    printMemoryLayout(arr,n);
    int* tmp = arr - 2;
    std::cout << "Array size: " << *tmp << std::endl;
}

更新: 使用的编译器是clang 7.0.0.3

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)