Ну, в принципе, можно поиграться самостоятельно с HeapWalk
(у вас же Windows?), например. Только тяжелая это работа, потому что даже пустая программа уже выделяет массу блоков памяти. Да и зависит от того, как менеджер памяти работает — он же может, например, запросить разово большой блок, а потом его уже внутри программы перераспределять. Так что сработает ли — зависит от массы факторов, в том числе от компилятора.
Просто как маленький пример —
int main(int argc, char * argv[])
{
HANDLE ph[20];
int hCount = GetProcessHeaps(20,ph);
char * q = new char[10000000];
q[3] = 0;
for(int i = 0; i < hCount; ++i)
{
PROCESS_HEAP_ENTRY phe;
phe.lpData = NULL;
cout << "Heap #" << i << endl;
for(;HeapWalk(ph[i],&phe);)
{
if (phe.wFlags & PROCESS_HEAP_ENTRY_BUSY)
cout << " Block at " << phe.lpData << ", size " << phe.cbData << endl;
}
}
}
На VC++ 2022 у меня выдает список из почти 200 блоков памяти, который заканчивается
Block at 000002414B410FA0, size 18
Block at 000002414B410FD0, size 4096
Block at 000002414B546040, size 10000000
т.е. вот он, последний выделенный блок :)
Так что если желание есть — попробуйте, только не уверен, что просто информация о фрагментации как-то позволит ее уменьшить, не переделывая кардинально программу, типа написания собственных аллокаторов, или своего менеджера памяти, который в начале работы заберет один большой кусок памяти и сам будет ее перераспределять под ваши потребности.