Требует ли освобождение вызова 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. Нужно ли его освобождать или это делается системой, когда программа заканчивается?
То, что вы выделили, является частью пространства памяти запущенного процесса. Это перестает существовать, когда процесс заканчивается.
На данный момент память, кажется, освобождается автоматически, но это хороший стиль, чтобы просто игнорировать освобождение?
Правильно. Когда процесс завершается, его адресные пространства больше не существуют. Нет никакого способа, которым это могло остаться выделенным. Как правило, игнорирование освобождения не считается хорошим стилем, потому что это делает код непригодным для больших программ и усложняет отладку утечек памяти. Но на самом деле это не приведет к утечке после завершения процесса.