Требует ли освобождение вызова HeapAlloc с помощью Assembly? - PullRequest
0 голосов
/ 28 декабря 2018

В начале моей программы я выделяю память, используя HeapAlloc.Обязательно ли освобождать его или это делается системой, когда программа заканчивается?

start:
    call   GetProcessHeap
    mov    r11, rax                ; r11 contains handle

    mov    rdi, 8000000
    mov    rsi, 0
    mov    rdx, r11
    call   HeapAlloc        

    mov    r12, rax       ; r12 contains pointer to memory block

    mov    ecx, 1000000
    xor    eax, eax
.looptop_populate
    add    rax, rcx
    mov    [r12+8*rcx-8], rax
    loop   .looptop_populate

    mov    rdi, [r12]
    call   write_uinteger
    xor    eax, eax
    ret

; goasm /x64 /l malloc
; golink /console malloc.obj kernel32.dll

В настоящее время память кажется автоматически освобожденной, но это хороший способ - просто игнорировать освобождение?

1 Ответ

0 голосов
/ 28 декабря 2018

В начале моей программы я выделяю память, используя HeapAlloc.Обязательно ли освобождать его или это делается системой после завершения программы?

То, что вы выделили, является частью пространства памяти запущенного процесса.Это прекращает существовать, когда процесс завершается.

В настоящее время память, кажется, автоматически освобождается, но это хороший стиль - просто игнорировать освобождение?

Этоправильный.Когда процесс завершается, его адресные пространства больше не существуют.Нет никакого способа, которым это могло остаться выделенным.Как правило, игнорирование освобождения не считается хорошим стилем, потому что это делает код непригодным для больших программ и усложняет отладку утечек памяти.Но на самом деле это не вызовет утечки после завершения процесса.

...