【问题标题】:Does a call to HeapAlloc with Assembly require deallocation?使用 Assembly 调用 HeapAlloc 是否需要重新分配?
【发布时间】:2019-05-25 23:28:00
【问题描述】:

在我的程序开始时,我使用 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

目前内存似乎是自动释放的,但忽略释放是一种很好的风格?

【问题讨论】:

    标签: assembly operating-system x86-64 heapalloc


    【解决方案1】:

    在我的程序开始时,我使用 HeapAlloc 分配内存。程序结束时是否需要释放它或由系统完成?

    您分配的是正在运行的进程内存空间的一部分。当进程终止时,这将不复存在。

    目前内存似乎是自动释放的,但忽略释放是一种很好的风格?

    没错。当一个进程终止时,它的地址空间不再存在。它不可能保持分配状态。一般来说,忽略释放被认为是不好的风格,因为它使代码无法用于更大的程序,并且更难调试内存泄漏。但它实际上不会在进程终止后导致任何泄漏。

    【讨论】:

    • 在现代(2000+)操作系统中......在历史上它可能是真正的问题。 ...即使在今天,在某些操作系统上保持打开的文件可能仍然存在问题(winxp 有这个问题 IIRC,不确定后来的,没有使用它们),所以通常释放/关闭所有分配的资源是编程中的好品味风格,但特别是内存可以被任何常见的东西很好地处理。
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2017-03-28
    相关资源
    最近更新 更多