【问题标题】:How is LLVM heap value preserved after freeing?释放后如何保留 LLVM 堆值?
【发布时间】: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 哇哦,它解释了这种行为,很高兴知道。谢谢!

标签: c++ c malloc llvm


【解决方案1】:

我认为您只需要阅读有关 malloc/free 的文档。 我猜这个问题在 C 线程中被问了数百万次。 这是一个例子:C - What Happens To Memory After free()?

【讨论】:

  • 谢谢,我当时不彻底!
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多