Требует ли освобождение вызова HeapAlloc с помощью Assembly?

В начале моей программы я выделяю память, используя 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 ответ

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

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

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

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

Другие вопросы по тегам