мучит вопрос с HeapFree

Тема в разделе "WASM.WIN32", создана пользователем karabas_barabas, 20 ноя 2011.

  1. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    Юзаю такие конструкции для освобождения и выделения памяти
    Код (Text):
    1. #define MALLOC(x) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (x))
    2. #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
    временами закрадываются глупые сомнения например если я выделю кусок памяти
    Код (Text):
    1. PVOD mem1 = MALLOC(200);
    2. //......................
    3. // тут куча операций с памятью в том числе HeapCreate в разных потоках и т.д.
    4. //......................
    5. FREE(mem1 );
    Есть ли вероятность, что GetProcessHeap() поменяется и в итоге до инструкции FREE(mem1 ) - в результате HeapFree получить не ту "хипу" в первом параметре и не освободит память ?

    p.s. вообще не понимаю зачем спроектировали HeapFree в таком виде как она есть сейчас - ведь по адресу блока памяти можно определить и соответствующую "хипу", ну хотя так оно немного быстрее то работает.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    бугагашечка... нет, вероятность этого равна нулю... если канеш какой-нить особо умный поток не подменит указатель на кучу процесса в PEB...
     
  3. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    впринципе ничего смешного я не вижу , если прийдется выделить кусок памяти больший размера GetProcessHeap(). Heap это собственно кусок памяти выделенный VirtualAlloc в начале которой своя служебная таблица. Этот же основной Heap - это банальное использование функции
    Код (Text):
    1. HANDLE WINAPI HeapCreate(
    2.   __in  DWORD flOptions,
    3.   __in  SIZE_T dwInitialSize,
    4.   __in  SIZE_T dwMaximumSize
    5. );
    со своим явным dwMaximumSize и с добавлением указателя в PEB. Операторы же new и delete построены как раз тупо на HeapAlloc/HeapFree.Так вот не исключена ситуация о которой я отписал выше - или я все усложняю ?
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    karabas_barabas
    Усложняешь, т.к. основная куча процесса является растущей (dwMaximumSize = 0), поэтому если первый выделенный виртуальный блок окажется занятым, то будет выделен второй и т.д. При этом указатели на эти доп. блоки, как и все прочие управляющие структуры остаются сидеть в первом\основном блоке по адресу = GetProcessHeap()
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    вот это как раз смешно... если ты попытаешься выделить память больше размера кучи (если вдруг возникнет такая ситуация, что ты достанешь до предела, то есть достанешь до того момента, когда не будет последовательного диапазона памяти), то память просто не выделится... куча процесса одна, указатель на нее хранится в PEB, если указатель в PEB не изменится каким-то нелепым образом, то функция GetProcessHeap не вернет другой указатель... для действительно больших размеров данных - не используй кучу, а выделяй память целыми страницами, хотя по сути - нет никакой разницы)))

    операторы new/delete вызывают malloc/free, которые используют статический указатель, который инициализирован в функции типа __heap_init с помощью GetProcessHeap...инициализация проходит один раз в CRT-main, до вызова твоей main функции...
     
  6. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    в точку, теперь понятно, спс за ответы