Google に問い合わせて、StackOverflow について調査しました。私の質問はmain()
、C++ プログラムで関数を入力して最初の変数を宣言すると、この変数のアドレスが実行ごとに異なるのはなぜですか? 以下のサンプルプログラムをご覧ください。
#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
ご覧のとおり、実行ごとに異なる結果が得られます。割り当てられたメモリのアドレスに対応する出力の最初の行は、ヒープで発生するはずです。毎回異なるアドレスが割り当てられている場合、私には意味があります。ただし、2 行目に対応するローカル変数のアドレスを出力しても、結果は異なります。
一見すると、プログラムが物理メモリ アドレスを出力しているためだと思っていましたが、この投稿Virtual Memory or Physical Memoryは私の最初の考えを反証しています。プログラムの実行が「同じ」で、スレッドやユーザー入力などがない場合、異なるアドレスのメモリ割り当てがまだあるという理由はありますか?
テスト環境:
- Linux 14.04
- マック OS X 10.10