【发布时间】:2021-04-02 21:24:57
【问题描述】:
我正在从 LLVM 代码调用一个 C 函数,它为这样的字符串分配一些空间:(char *) malloc(..len..);
%0 中的这个分配值然后存储在堆栈变量%something 中。
define i8* @someFun() {
entry:
%something = alloca i8*, align 8
; mallocing some space for a string
%0 = call i8* @<function-using-malloc>()
store i8* %0, i8** %something, align 8
; freeing heap space
%1 = call i8* @free(i8* %0)
%2 = load i8*, i8** %something, align 8
ret i8* %2
}
在store 指令之后,我释放%0,然后从函数中返回%something。
那么在收到someFun()的返回值后,main()中的值仍然可用,不过我猜应该是被释放了?
define i32 @main() {
entry:
; printing value here correctly after free
%0 = call i8* @someFun()
..printing %0..
ret i32 0
}
我可能缺少一些内存管理知识,所以我的问题是在这种情况下释放%0 之前和之后会发生什么?这个值是从堆复制到栈的吗?
【问题讨论】:
-
释放的内存不只是“消失”。它仍然存在,等待被重用。然而,访问它是未定义的行为,因此结果充其量是不可预测的。
-
@PaulSanders 哇哦,它解释了这种行为,很高兴知道。谢谢!