割り当てが失敗する前に、どれだけのメモリを割り当てることができるかを調べようとしています。
この単純な C++ コードは、バッファ (サイズ 1024 バイト) を割り当て、バッファの最後の 5 文字に割り当て、レポートし、バッファを削除します。次に、バッファのサイズを 2 倍にして、失敗するまで繰り返します。
何か見落としがない限り、コードは MacBook Pro でエラーが発生する前に最大 65 テラバイトのメモリを割り当てることができます。これは可能なのでしょうか? マシンに搭載されているメモリよりも多くのメモリを割り当てることができるのはなぜでしょうか? 何か単純なことを見落としているに違いありません。
int main(int argc, char *argv[])
{
long long size=1024;
long cnt=0;
while (true)
{
char *buffer = new char[size];
// Assume the alloc succeeded. We are looking for the failure after all.
// Try to write to the allocated memory, may fail
buffer[size-5] = 'T';
buffer[size-4] = 'e';
buffer[size-3] = 's';
buffer[size-2] = 't';
buffer[size-1] = '\0';
// report
if (cnt<10)
cout << "size[" << cnt << "]: " << (size/1024.) << "Kb ";
else if (cnt<20)
cout << "size[" << cnt << "]: " << (size/1024./1024.) << "Mb ";
else
cout << "size[" << cnt << "]: " << (size/1024./1024./1024.) << "Gi ";
cout << "addr: 0x" << (long)buffer << " ";
cout << "str: " << &buffer[size-5] << "\n";
// cleanup
delete [] buffer;
// double size and continue
size *= 2;
cnt++;
}
return 0;
}
ベストアンサー1
メモリを要求すると、オペレーティングシステムは実際にはメモリを要求しない権利を留保します。与える実際に使用するまでその記憶は残りません。
ここで起きているのはまさにこれです。5 バイトしか使用しません。1980 年代の私の ZX81 はそれを処理できました。