【发布时间】:2016-01-20 19:24:15
【问题描述】:
我已经询问了 Google,并对 StackOverflow 进行了一些研究。我的问题是,当我在 C++ 程序中输入 main() 函数并声明第一个变量时,为什么这个变量的地址会因不同的执行而不同?请参阅下面的示例程序:
#include <iostream>
int main() {
int *a = new int;
int *b = new int;
std::cout << "address: " << a << " " << b << std::endl;
std::cout << "address of locals: " << &a << " " << &b << std::endl;
return 0;
}
执行 1 的结果:
address: 0xa32010 0xa32030
address of locals: 0x7fff10de2cf0 0x7fff10de2cf8
执行 2 的结果:
address: 0x1668010 0x1668030
address of locals: 0x7ffc252ccd90 0x7ffc252ccd98
执行 3 的结果:
address: 0x10e0010 0x10e0030
address of locals: 0x7ffd3d2cf7f0 0x7ffd3d2cf7f8
如您所见,我在不同的执行过程中得到不同的结果。输出的第一行对应于分配内存的地址,这应该发生在堆中——如果它们每次都分配不同的地址,这对我来说有点道理。然而,即使我打印了局部变量的地址——对应于第二行——结果仍然不同。
乍一看,我以为是因为程序正在打印物理内存地址,但这篇 Virtual Memory or Physical Memory 的帖子反驳了我最初的想法。鉴于程序的执行是“相同的”,没有线程、没有用户输入等,是否有任何理由仍然存在具有不同地址的内存分配?
测试环境:
- Linux 14.04
- Mac OS X 10.10
【问题讨论】:
-
一方面,ASLR 可能有所贡献——它是否在您的测试系统的内核中启用?
-
是的,这几乎可以肯定是ASLR 在工作。
-
@fish2000,您当然应该将此作为答案添加一些解释。
-
非确定性编译器优化在这里也可能会搞砸。
-
@Sergey 完成了,谢谢!
标签: c++ c memory virtual-memory aslr