Я пытаюсь выяснить, сколько памяти я могу выделить до того, как распределение не будет выполнено.
Этот простой код на С++ выделяет буфер (размером 1024 байта), присваивает последние пять символов буфера, отчеты, а затем удаляет буфер. Затем он удваивает размер буфера и повторяется до тех пор, пока не сработает.
Если мне что-то не хватает, код может выделить до 65 терабайт памяти, прежде чем он завершится с ошибкой на моем MacBook Pro. Возможно ли это? Как он может выделять столько памяти, сколько у меня на машине? Я должен пропустить что-то простое.
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;
}