【发布时间】:2020-05-09 07:38:18
【问题描述】:
我正在使用 LLVM-C 编写一个小玩具语言。 我也在使用 valgrind 来检查内存泄漏。
这是我的基本婴儿计划:
#include <stdio.h>
#include <llvm-c/Core.h>
int main()
{
size_t length;
LLVMModuleRef module = LLVMModuleCreateWithName("llvm.hello");
printf("Module name: %s\n", LLVMGetModuleIdentifier(module, &length));
LLVMDisposeModule(module);
LLVMShutDown();
return 0;
}
我可以按预期正常编译和运行程序。但是,当我通过 valgrind 运行程序时,它告诉我我有一些像这样“仍然可以访问”的分配内存。
valgrind --leak-check=full out/hello_llvm
==5807== LEAK SUMMARY:
==5807== definitely lost: 0 bytes in 0 blocks
==5807== indirectly lost: 0 bytes in 0 blocks
==5807== possibly lost: 0 bytes in 0 blocks
==5807== still reachable: 56 bytes in 2 blocks
==5807== suppressed: 0 bytes in 0 blocks
在此站点上搜索答案时,我发现许多编码人员都说“仍然可以访问”内存泄漏并不是什么大问题。我不想为此争论。我想要的是在终止我的程序之前摆脱所有分配的内存。
有什么方法可以在终止前将分配的内存减少到零?
【问题讨论】:
-
如果在您的
main失去任何访问方式后仍有可访问的分配内存,则必须从静态对象指向它。换句话说,LLVM 有一些具有静态存储持续时间的对象(直接或间接)指向分配的内存。 valgrind 会向你展示更多吗?您可能必须深入研究 LLVM 源代码才能了解它在做什么。在不同的调用中分配一些内存以供长期使用可能是有意义的,但它可以被视为设计缺陷。 -
@EricPostpischil 如果我查看 valgrind 给出的详细报告,似乎已经为线程目的进行了一些分配,但没有释放... ==7288== by 0xA134826: __pthread_once_slow (pthread_once. c:116) ==7288== by 0x580D675: llvm::ManagedStaticBase::RegisterManagedStatic
标签: c memory-leaks llvm valgrind