【发布时间】:2020-03-04 05:38:01
【问题描述】:
我正在运行一个简单的程序来显示单个进程范围内堆栈和堆之间的内存容量,并且收到一些我可能会误解的奇怪值。
我正在运行这段代码:
int main() {
uint64_t *heap = new uint64_t;
uint64_t stackvar;
uint64_t diff = &stackvar - heap;
float size = (float) diff/ (1024 * 1024 * 1024); // conversion to GB
free(heap);
return 0;
}
分配的堆变量和堆栈变量的地址值是有道理的,但我相信我误解了如何计算两者之间的内存容量,因为diff 的最终值在 16TB 范围内通过上面代码中的转换运行它。
如何有效地将这个范围转换为可理解的内存范围,或者如果我犯了错误,diff 的正确解释是什么?
【问题讨论】:
-
@tf 这个语句 uint64_t diff = &stackvar - heap;没有意义并且具有未定义的行为。
-
我很确定是UB来获取指向不同分配对象的指针之间的差异(无论是本地数组还是动态数组)
-
为什么16TB看起来不合理?毕竟,您正在处理的是虚拟地址,而不是物理地址。
-
你
freed 当你应该有deleted 顺便说一句。这也是 UB。 -
即使您设法获得了差异,也与容量无关。地址是虚拟的,甚至可能无法映射或访问该空间。