Как правильно вызвать LocalFree ?

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 4 апр 2006.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Никак не догоню как использовать локальную переменную.

    Ситуация: процедура выделяет память и хранит казатель

    на нее в локальной lpResult

    Я никак не могу вернуть его из процедуры!

    Все ок пока не вызову LocalFree.



    Без этого вызова - все работает нормально.

    Что здесь не так?



    Вот код:
    Код (Text):
    1.  
    2. proc someProcedure
    3.  
    4.   ; Pointer to result string
    5.   local lpResult : DWORD
    6.  
    7.   ; some processing ......
    8.  
    9.   ; Store result in stack
    10.   mov eax, [lpResult]
    11.   push eax
    12.  
    13.   ; Remove all local variables
    14.   invoke  LocalFree, [lpResult]
    15.  
    16.   ; Return pointer to allocated memory
    17.   pop eax
    18.  
    19.   ret
    20. endp
    21.  
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    1) Не стоит плодить топики на одну и ту же тему

    2) Вызывая LocalFree в своей процедуре, ты удаляешь выделенный блок памяти и указатель на него становится инвалидным

    3) Чтобы не ломать голову над удалением памяти и разрешением конфликтов потоков, проще всего возложить обязанность освобождения выделенной памяти на вызывающие функции (на сами потоки) - попользовался, будь добр освободи сам. Это является общим правилом и для WinAPI - получил хэндл, не забудь закрыть
     
  3. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    По теме топика что-нибудь путное можешь сказать ?





    Наверно я вопрос не очень правильно поставил.

    Попробую еще раз.

    Мне нужна локальная переменная для хранения указателя.

    Указатель куда-нибудь, пускай там будет NULL (для простоты - т.е. я нигде и никак память не выделяю).



    Когда я вызываю LocalFree, оно почему то освобождает

    память куда указывает моя локальная переменная, а не

    саму переменную.

    Вроде так...

    Кажется совсем просто, но с другой стороны запутанно.



    На МСДН написано что "This function frees the specified local memory object and invalidates its handle"

    Получается что локальная переменная - это handle объекта памяти.

    Тогда где сам указатель ???

    Ничего не понимаю.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ты имеешь ввиду, что после LocalFree указатель остаётся прежним? Верно, но он уже указывает на освобождённый участок памяти, и его обычно обнуляют после xxxFree. В принципе, логичнее было бы, чтобы xxxFree и обнуляла его, но этого нет, видимо, для простоты.



    А вообще, тебе не раз говорили, выбрось эти старые функции и возьми HeapAlloc/HeapFree.
     
  5. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Вызовом LocalFree ты должен освобождать память, которую ты выделил через LocalAlloc, а ты что пытаешься сделать в своем коде!?

    Пример:
    Код (Text):
    1. DoSome proc String:DWORD
    2. LOCAL lpResult: DWORD
    3. invoke lstrlen,String
    4. invoke LocalAlloc,LMEM_FIXED+LMEM_ZEROINIT,eax ;выделяем память количеством eax
    5. push eax ;сохранили указатель на выделенную память
    6. ..... ; какие-то действия
    7. mov lpResult,eax
    8. ..... ;
    9. pop eax
    10. invoke LocalFree,eax
    11. mov eax,lpResult
    12. ret
    13. endp
     
  6. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Локальную переменную освобождать вызовом LocalFree не нужно, так как она создается на стеке. Она освобождается, когда ты делаешь RET: прибавляется нужное число байтов к ESP.
     
  7. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Сорри всем.

    Разобрался.



    Я действительно все перепутал - я почему то решил

    что эта ф-ция удаляет локальную переменную :)



    Всем спасибо.

    Изивините, если мой тон показался резким.