Без споров о том, почему и когда это было бы полезно, попытки перераспределения в цикле могли работать, по крайней мере, в Windows с 64-битным кодом и настройками по умолчанию. Более того, это может приобрести удивительно дополнительную дополнительную виртуальную память. Хотя, не делайте этого в бесконечном цикле, но вместо этого используйте конечное число попыток. В качестве доказательства попробуйте следующий код, который имитирует утечку 1 Мб памяти. Вы должны запустить его в сборке Release, желательно не под отладчиком.
for (int i = 0; i < 10; i++)
{
size_t allocated = 0;
while (1)
{
void* p = malloc(1024 * 1024);
if (!p)
break;
allocated += 1;
}
//This prints only after malloc had failed.
std::cout << "Allocated: " << allocated << " Mb\n";
//Sleep(1000);
}
На моей машине с 8 Гб оперативной памяти и управляемой системой подкачки, я получаю следующий вывод (построен с VS2013 для цели x64, протестирован на Windows 7 Pro):
Allocated: 14075 Mb
Allocated: 16 Mb
Allocated: 2392 Mb
Allocated: 3 Mb
Allocated: 2791 Mb
Allocated: 16 Mb
Allocated: 3172 Mb
Allocated: 16 Mb
Allocated: 3651 Mb
Allocated: 15 Mb
Я не» t знать точную причину такого поведения, но кажется, что отчисления начинают сбой после того, как изменение размера профайла не может идти в ногу с запросами. На моей машине файл подкачки вырос с 8 до 20 Гб после этого цикла (сбрасывается до 8 ГБ после выхода программы).
Это может иметь смысл даже в однопоточной программе, если причиной сбоя является исчерпание общей памяти в системе, а не только ограничение для каждого процесса, такое как размер виртуального адресного пространства или предел 'setrlimit' , –