malloc vs HeapAlloc

Тема в разделе "WASM.WIN32", создана пользователем AlannY, 24 окт 2008.

  1. AlannY

    AlannY New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2008
    Сообщения:
    41
    Вот моя программа порождает Heap Corruption. Полазив по инэту не нашёл ничего о том, как это повреждение кучи исправить. Зато родился новый вопрос:

    Отличаются ли malloc и HeapAlloc? В мой программе повсеместно используется HeapAlloc, который требует HeapFree для освобождения памяти. При этом если попробывать освободить память HeapAlloc при помощи free - генерируется ошибка. Т.е. эти функиции делают разные вещи. И ещё например _tcsdup позвращает строку выделенную при помощи malloc и если попробывать её освободить при помощи HeapFree - ошибка.

    Что лучше: malloc или HeapAlloc?

    P.S. В программирование под Windows я просто ламер :)
     
  2. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    AlannY
    разные реализации хипа. качество маллока зависит от конкретной либС. Юзанье ХипАллок иногда позволяет слегка уменьшить размеры проги и с бряками попроще, но вобще он не оч быстрый.
     
  3. AlannY

    AlannY New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2008
    Сообщения:
    41
    Спасибо, теперь буду искать проблемы с HeapAlloc, которая у меня возвращает NULL.

    Кстати, не знаете такой реализации _tcsdup, что бы она использовала HeapAlloc?
     
  4. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Google rocks :)

    http://msdn.microsoft.com/en-us/library/aa366533(VS.85).aspx
    http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c9535
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    AlannY

    Вот простенький "свой" _tcsdup:

    Код (Text):
    1. PTCHAR _tcsdup2 (LPCTSTR pszText, HANDLE hHeap)
    2. {
    3.     int nBytes = (_tcslen (pszText) + 1) * sizeof (TCHAR);
    4.     PTCHAR pszDuplicate = (PTCHAR) HeapAlloc (hHeap, HEAP_NO_SERIALIZE, nBytes);
    5.  
    6.     if (pszDuplicate != NULL)
    7.     {
    8.         memcpy (pszDuplicate, pszText, nBytes);
    9.     }
    10.     return pszDuplicate;
    11. }
    12.  
    13. #define STRDUP(text)        _tcsdup2 (text, GetProcessHeap ())
    14. #define FREE_STRDUP(text)   if ((text) != NULL) HeapFree (GetProcessHeap (), HEAP_NO_SERIALIZE, text)
    15.  
    16. // Example:
    17.  
    18. PTCHAR pszMsg = STRDUP ("SPOCK: 'CAPTAIN, MAY I SUGGEST A SHUTTLECRAFT.'");
    19. if (pszMsg != NULL)
    20. {
    21.     // ... use it
    22.     FREE_STRDUP (pszMsg);
    23. }
    Но это наверняка не поможет с Heap Corruption. Один из методов поиска такой ситуации:

    http://msdn.microsoft.com/en-us/library/aa366708(VS.85).aspx