Пытаясь поэкспериментировать с распределением стека по сравнению с кучей в тестовой программе C++, я сначала был удивлен, обнаружив, что Windows не обязательно размещает стек по высоким адресам, а кучу по низким адресам. Копнув глубже, я был еще больше удивлен, обнаружив, что он поддерживает несколько куч, подробности о которых можно узнать программно, как показано здесь. Итак, у меня в тестовой программе (на Win10, x86-64, mingw73_64):
Код: Выделить всё
int main(int argc, char *argv[])
{
// [GetProcessHeaps code copy-pasted here from the MS link above]
// . . .
// . . .
int* ptr = new int[64];
qDebug("int array malloc addr in main() = %p", ptr);
delete [] ptr;
// New type that does nothing interesting other than debug prints in ctor/dtor
Foo* pf = new Foo();
qDebug("Foo malloc addr in main() = %p", pf);
delete pf;
return 0;
}
[qDebug — это функция Qt, не имеющая отношения к настоящей проблеме.] Я ожидал, что оба распределения будут выполнены из одной из программных куч. Вместо этого я вижу следующее:
Код: Выделить всё
Num heaps = 3
Heap 0 at address: 0x750000 - 0x777000, size 159744 bytes
Heap 1 at address: 0x10000 - 0x20000, size 65536 bytes
Heap 2 at address: 0x1c0000 - 0x1c8000, size 32768 bytes
int array malloc addr in main() = 0x1c64b0
Foo alloc addr in main() = 0xc673920
Как видите, выделение массива int выполняется из кучи 2, но выделение Foo где-то отсутствует в левом поле. (Размеры кучи получены из кода здесь.) Повторные прогоны дают разные адреса, но результаты одинаковы (также видели, как оба выделения выходят из «четвертой кучи»). Есть ли еще кучи помимо трех, напечатанных кодом MS? Есть ли другой способ получить полный список?
Подробнее здесь:
https://stackoverflow.com/questions/652 ... on-windows