Юзаю такие конструкции для освобождения и выделения памяти Код (Text): #define MALLOC(x) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (x)) #define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) временами закрадываются глупые сомнения например если я выделю кусок памяти Код (Text): PVOD mem1 = MALLOC(200); //...................... // тут куча операций с памятью в том числе HeapCreate в разных потоках и т.д. //...................... FREE(mem1 ); Есть ли вероятность, что GetProcessHeap() поменяется и в итоге до инструкции FREE(mem1 ) - в результате HeapFree получить не ту "хипу" в первом параметре и не освободит память ? p.s. вообще не понимаю зачем спроектировали HeapFree в таком виде как она есть сейчас - ведь по адресу блока памяти можно определить и соответствующую "хипу", ну хотя так оно немного быстрее то работает.
бугагашечка... нет, вероятность этого равна нулю... если канеш какой-нить особо умный поток не подменит указатель на кучу процесса в PEB...
впринципе ничего смешного я не вижу , если прийдется выделить кусок памяти больший размера GetProcessHeap(). Heap это собственно кусок памяти выделенный VirtualAlloc в начале которой своя служебная таблица. Этот же основной Heap - это банальное использование функции Код (Text): HANDLE WINAPI HeapCreate( __in DWORD flOptions, __in SIZE_T dwInitialSize, __in SIZE_T dwMaximumSize ); со своим явным dwMaximumSize и с добавлением указателя в PEB. Операторы же new и delete построены как раз тупо на HeapAlloc/HeapFree.Так вот не исключена ситуация о которой я отписал выше - или я все усложняю ?
karabas_barabas Усложняешь, т.к. основная куча процесса является растущей (dwMaximumSize = 0), поэтому если первый выделенный виртуальный блок окажется занятым, то будет выделен второй и т.д. При этом указатели на эти доп. блоки, как и все прочие управляющие структуры остаются сидеть в первом\основном блоке по адресу = GetProcessHeap()
вот это как раз смешно... если ты попытаешься выделить память больше размера кучи (если вдруг возникнет такая ситуация, что ты достанешь до предела, то есть достанешь до того момента, когда не будет последовательного диапазона памяти), то память просто не выделится... куча процесса одна, указатель на нее хранится в PEB, если указатель в PEB не изменится каким-то нелепым образом, то функция GetProcessHeap не вернет другой указатель... для действительно больших размеров данных - не используй кучу, а выделяй память целыми страницами, хотя по сути - нет никакой разницы))) операторы new/delete вызывают malloc/free, которые используют статический указатель, который инициализирован в функции типа __heap_init с помощью GetProcessHeap...инициализация проходит один раз в CRT-main, до вызова твоей main функции...