问题描述
我想研究一下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 (将#修改为@)