在FFI模块中是否有必要将字符串传递回调用代码以防止内存泄漏?

时间:2019-05-05 21:31:12

标签: ruby rust

我有

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,但似乎没有发现任何泄漏。

1 个答案:

答案 0 :(得分:2)

  

我是否必须将字符串传递回Rust才能被释放?

是的

  

垃圾回收会不会捡起这个some_string并将其释放?

是的,但这不是担心的内存泄漏。垃圾收集器 将释放由Ruby分配的包含转换后的Ruby字符串的内存。

但是,垃圾收集器不了解Rust进行的分配。具体来说,Rust代码甚至可能已经不是进行了分配。在这种情况下,如果调用代码释放了字符串,则将导致内存不安全,因此FFI库无法假定此char *是分配。

即使这样做,也不会知道要使用哪个分配器进行分配。请记住,在一个中等复杂的应用程序中经常有多个分配器在起作用。

免责声明:我是 Omnibus 的作者。