VitrualAlloc vs new/malloc
От: CannyMan  
Дата: 06.10.11 04:48
Оценка:
С помощью 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 нет?
Re: VitrualAlloc vs new/malloc
От: CannyMan  
Дата: 06.10.11 05:14
Оценка:
Для HeapAlloc нужно отнимать 48 байт иначе не выделяет.

PVOID ha = HeapAlloc(GetProcessHeap(), 0, size - 48);


WTF?
Re: VitrualAlloc vs new/malloc
От: мыщъх США http://nezumi-lab.org
Дата: 06.10.11 05:20
Оценка: 3 (1) +1
Здравствуйте, CannyMan, Вы писали:

CM>Откуда взялись эти лишние байты? Почему VirtualAlloc с этим размером нормально выделяет память, а malloc нет?

исходники crt идут со студией. КО подсказывает, что malloc это rtl-куча, реализованная поверх виндовой кучи. в студийном отладчике видно как она устроена.

malloc зовет virt_alloc, но часть выделенного блока использует под свои нужды. там двунаправленный список блоков, размер блока, статус...
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.
Re[2]: VitrualAlloc vs new/malloc
От: мыщъх США http://nezumi-lab.org
Дата: 06.10.11 05:23
Оценка:
Здравствуйте, 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.
Re: VitrualAlloc vs new/malloc
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 06.10.11 05:35
Оценка: 3 (1)
The Old New Thing: There's also a large object heap for unmanaged code, but it's inside the regular heap
Ce n'est que pour vous dire ce que je vous dis.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.