С помощью VirtualQuery выяснил самый большой регион свободной памяти MEM_FREE.
Адрес в соответствие с гранулярностью.
Вызываю VirtualAlloc передавая этот максимальный размер — всё ОК — функция вернула адрес по которому выделила память.
PVOID va = VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
Заменяю эту строку на
char * arr = new char[size];
рассчитывая таким образом выделить память в куче.
Получаю облом — кидается исключение bad_alloc.
То же самое с malloc.
Экспериментально выяснил, что память будет успешно выделяться если задать size = size — 84;
Откуда взялись эти лишние байты? Почему VirtualAlloc с этим размером нормально выделяет память, а malloc нет?
Для HeapAlloc нужно отнимать 48 байт иначе не выделяет.
PVOID ha = HeapAlloc(GetProcessHeap(), 0, size - 48);
WTF?
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, CannyMan, Вы писали:
CM>Для HeapAlloc нужно отнимать 48 байт иначе не выделяет.
CM>CM>PVOID ha = HeapAlloc(GetProcessHeap(), 0, size - 48);
CM>
CM>WTF?
скачайте OllyDbg и посмотрите что творится в памяти. HeapAlloc работает с кучей примерно так же как malloc, только HeapAlloc это виндовая функция, а не rtl.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.