【发布时间】:2020-10-17 17:07:24
【问题描述】:
我正在编写一个 C 程序,它使用 Apple 的 Blocks 扩展来提供词法闭包。我也在使用 Boehm 垃圾收集器。我希望 Block_copy() 在堆上分配块时使用 GC_MALLOC,以便它们被垃圾收集。
#include <stdio.h>
#include <Block.h>
#include <GC.h>
int main()
{
int i = 42;
void(^test)(void) = Block_copy(^{printf("Hello %d\n", i);});
test();
}
我使用 -DREDIRECT_MALLOC=GC_MALLOC -DREDIRECT_REALLOC=GC_REALLOC -DIGNORE_FREE 从源代码编译 libBlocksRuntime (https://github.com/mackyle/blocksruntime),以便让 Boehm 覆盖 malloc() 和 realloc() 调用。
然后我用 -fblocks -lBlocksRuntime -l:libgc.so -fsanitize=address 编译了上面的 c 程序,但它显示内存已泄漏,因此 Block_copy() 未使用 Boehm 的分配器。
Hello 42
==5885==WARNING: invalid path to external symbolizer!
==5885==WARNING: Failed to use and restart external symbolizer!
=================================================================
==5885==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 36 byte(s) in 1 object(s) allocated from:
#0 0x4961ed (/home/finn/test+0x4961ed)
#1 0x7ff40c7e0c04 (/lib/x86_64-linux-gnu/libBlocksRuntime.so.0+0xc04)
#2 0x7ff40c436cc9 (/lib/x86_64-linux-gnu/libc.so.6+0x26cc9)
SUMMARY: AddressSanitizer: 36 byte(s) leaked in 1 allocation(s).
如何强制 libBlocksRuntime 使用 Boehm 的内存分配器?
编辑: 我尝试通过使用 malloc 钩子,然后使用 LD_PRELOAD 来解决这个问题,但这些似乎都不能与 libBlocksRuntime(或一般的块)合作。
【问题讨论】:
-
我认为你应该将_Block_allocator设置为调用GC_MALLOC的函数,_Block_deallocator应该设置为什么都不做的函数。
-
@IvanMaidanski 我尝试设置_Block_allocator,但它似乎已被声明为静态,因此对我的程序不可见。
标签: c++ c clang objective-c-blocks boehm-gc