在 Ruby FFI 中,当我 return 一个动态分配的字符串时,我应该释放它吗?
In Ruby FFI when I return a dynamically allocated string should I free it?
我在C中有以下函数
char* strfunc()
{
char* ch=calloc(100,1);
strcpy(ch,"hello");
return ch;
}
然后在 ruby 我有
module XYZ
extend FFI::Library
ffi_lib "mylib.so"
attach_function :strfunc, [] , :string
end
我应该将 free 导入分配给返回的字符串的 free 内存还是 Ruby GC 会为我做这件事?
我猜 ruby GC 会处理它。然而,你自己真的很容易看到。您可以使用 GC.start and GC.stat 来确定您正在分配的对象是否会在 GC 运行时被释放。
FFI 和 ruby GC 都不会自动释放它,因为它们不知道它是 malloc 的,而不仅仅是一些静态内存。
您应该使用 libc 的 free()
调用手动释放它。请参考此工单 https://github.com/ffi/ffi/issues/467 以获取示例。
我在C中有以下函数
char* strfunc()
{
char* ch=calloc(100,1);
strcpy(ch,"hello");
return ch;
}
然后在 ruby 我有
module XYZ
extend FFI::Library
ffi_lib "mylib.so"
attach_function :strfunc, [] , :string
end
我应该将 free 导入分配给返回的字符串的 free 内存还是 Ruby GC 会为我做这件事?
我猜 ruby GC 会处理它。然而,你自己真的很容易看到。您可以使用 GC.start and GC.stat 来确定您正在分配的对象是否会在 GC 运行时被释放。
FFI 和 ruby GC 都不会自动释放它,因为它们不知道它是 malloc 的,而不仅仅是一些静态内存。
您应该使用 libc 的 free()
调用手动释放它。请参考此工单 https://github.com/ffi/ffi/issues/467 以获取示例。