*const c_char { CString::from("Hello").unwrap-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:15:31 24 4
gpt4 key购买 nike

我有

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

最佳答案

Do I have to pass the string back to Rust to be freed?

是的。

Won't garbage collection pick this some_string up and free it?

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

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

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

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

关于ruby - 是否将字符串传回 FFI 模块中必要的调用代码以防止内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55996597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com