我有
lib.rs
#[no_mangle]
pub extern "C" fn test() -> *const c_char {
CString::from("Hello").unwrap().into_raw()
}
在Ruby中,我称其为
main.rb
require 'ffi'
module Rust
extend FFI::Library
# [redacted loading the library]
attach_function :test, [], :string
end
some_string = Rust::test()
是否必须将字符串传递回Rust才能被释放?不会收集这些some_string
并将其释放吗?
我使用The Rust FFI Omnibus作为参考。我运行了valgrind ruby main.rb
,但似乎没有发现任何泄漏。
答案 0 :(得分:2)
我是否必须将字符串传递回Rust才能被释放?
是的
垃圾回收会不会捡起这个
some_string
并将其释放?
是的,但这不是担心的内存泄漏。垃圾收集器 将释放由Ruby分配的包含转换后的Ruby字符串的内存。
但是,垃圾收集器不了解Rust进行的分配。具体来说,Rust代码甚至可能已经不是进行了分配。在这种情况下,如果调用代码释放了字符串,则将导致内存不安全,因此FFI库无法假定此char *
是分配。
即使这样做,也不会知道要使用哪个分配器进行分配。请记住,在一个中等复杂的应用程序中经常有多个分配器在起作用。
免责声明:我是 Omnibus 的作者。