Никак не догоню как использовать локальную переменную. Ситуация: процедура выделяет память и хранит казатель на нее в локальной lpResult Я никак не могу вернуть его из процедуры! Все ок пока не вызову LocalFree. Без этого вызова - все работает нормально. Что здесь не так? Вот код: Код (Text): proc someProcedure ; Pointer to result string local lpResult : DWORD ; some processing ...... ; Store result in stack mov eax, [lpResult] push eax ; Remove all local variables invoke LocalFree, [lpResult] ; Return pointer to allocated memory pop eax ret endp
1) Не стоит плодить топики на одну и ту же тему 2) Вызывая LocalFree в своей процедуре, ты удаляешь выделенный блок памяти и указатель на него становится инвалидным 3) Чтобы не ломать голову над удалением памяти и разрешением конфликтов потоков, проще всего возложить обязанность освобождения выделенной памяти на вызывающие функции (на сами потоки) - попользовался, будь добр освободи сам. Это является общим правилом и для WinAPI - получил хэндл, не забудь закрыть
По теме топика что-нибудь путное можешь сказать ? Наверно я вопрос не очень правильно поставил. Попробую еще раз. Мне нужна локальная переменная для хранения указателя. Указатель куда-нибудь, пускай там будет NULL (для простоты - т.е. я нигде и никак память не выделяю). Когда я вызываю LocalFree, оно почему то освобождает память куда указывает моя локальная переменная, а не саму переменную. Вроде так... Кажется совсем просто, но с другой стороны запутанно. На МСДН написано что "This function frees the specified local memory object and invalidates its handle" Получается что локальная переменная - это handle объекта памяти. Тогда где сам указатель ??? Ничего не понимаю.
Ты имеешь ввиду, что после LocalFree указатель остаётся прежним? Верно, но он уже указывает на освобождённый участок памяти, и его обычно обнуляют после xxxFree. В принципе, логичнее было бы, чтобы xxxFree и обнуляла его, но этого нет, видимо, для простоты. А вообще, тебе не раз говорили, выбрось эти старые функции и возьми HeapAlloc/HeapFree.
Вызовом LocalFree ты должен освобождать память, которую ты выделил через LocalAlloc, а ты что пытаешься сделать в своем коде!? Пример: Код (Text): DoSome proc String:DWORD LOCAL lpResult: DWORD invoke lstrlen,String invoke LocalAlloc,LMEM_FIXED+LMEM_ZEROINIT,eax ;выделяем память количеством eax push eax ;сохранили указатель на выделенную память ..... ; какие-то действия mov lpResult,eax ..... ; pop eax invoke LocalFree,eax mov eax,lpResult ret endp
Локальную переменную освобождать вызовом LocalFree не нужно, так как она создается на стеке. Она освобождается, когда ты делаешь RET: прибавляется нужное число байтов к ESP.
Сорри всем. Разобрался. Я действительно все перепутал - я почему то решил что эта ф-ция удаляет локальную переменную Всем спасибо. Изивините, если мой тон показался резким.