Освобождение памяти - ошибка

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

  1. h0kum

    h0kum New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2003
    Сообщения:
    47
    Добрый день всем.
    Столкнулся с такой проблемы, после выделении памяти и использовании, не могу потом освободить её, пробовал c GlobalFree которая возвращает тот же указатель а не 0
    потом попробовал сделать на HeapXXXX такая же проблема. Вот кусок кода:
    Код (Text):
    1. invoke CreateFile,addr BanFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    2.     .if eax!=-1
    3.         mov hFile,eax
    4.         invoke GetFileSize,hFile,NULL
    5.         mov BanFileSize,eax
    6.         ;------------------------------------------------------------------)
    7.         invoke HeapCreate,HEAP_NO_SERIALIZE,[BanFileSize],NULL
    8.         mov hMem,eax
    9.         invoke HeapAlloc,hMem,HEAP_ZERO_MEMORY,[BanFileSize]
    10.         mov pMem,eax
    11.        
    12.         ;invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,[BanFileSize]
    13.         ;mov  hMem,eax
    14.         ;invoke GlobalLock,hMem
    15.         ;mov  pMem,eax
    16.         ;------------------------------------------------------------------)
    17.  
    18.  
    19.         invoke HeapCreate,HEAP_NO_SERIALIZE,[BanFileSize],NULL
    20.         mov hBan,eax
    21.         invoke HeapAlloc,hBan,HEAP_ZERO_MEMORY,[BanFileSize]
    22.         mov pBan,eax
    23.        
    24.         ;invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,[BanFileSize]
    25.         ;mov  hBan,eax
    26.         ;invoke GlobalLock,hBan
    27.         ;mov  pBan,eax
    28.  
    29.         ;------------------------------------------------------------------)       
    30.         invoke ReadFile,hFile,pMem,BanFileSize,addr RealySize,NULL
    31.         mov eax,[BanFileSize]
    32.         mov ebx,[pMem]
    33.         mov byte ptr [ebx+eax],0
    34.         invoke SendMessage,hEditor,WM_SETTEXT,FALSE,ebx
    35.         mov ebx,[pMem]     
    36.         mov edx,[pBan]     
    37.         xor edi,edi
    38.         .while edi<=[BanFileSize]
    39.             mov al,byte ptr [ebx]
    40.             .if al!=0Dh
    41.                 .if al==0Ah
    42.                     mov byte ptr [edx],0
    43.                 .else
    44.                     mov byte ptr [edx],al
    45.                 .endif
    46.                 inc SizepBan
    47.                 inc edx
    48.             .endif         
    49.             inc ebx
    50.             inc edi
    51.         .endw      
    52.         invoke HeapFree,hMem,HEAP_NO_SERIALIZE,pMem
    53.         invoke CloseHandle,hFile
    если освобождать сразу после выделения памяти прокатывает, если после маневров с памятью, то не хочет ...

    подскажите в чем проблема ...

    (ой не туда пост засунул)
     
  2. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Код (Text):
    1.         mov eax,[BanFileSize]
    2.         mov ebx,[pMem]
    3.         mov byte ptr [ebx+eax],0
    Под pMem нужно выделять на один байт больше, [BanFileSize]+1. При таком коде, как сейчас, затирается первый байт после выделенной памяти. В котором запросто могут храниться системные данные.
     
  3. h0kum

    h0kum New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2003
    Сообщения:
    47
    Да в этом была проблема.
    Спасибо