Нужна ли передача строки обратно в вызывающий код в модулях FFI для предотвращения утечек памяти? - PullRequest
1 голос
/ 06 мая 2019

У меня есть

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 и освободит его?

Я использую Rust FFI Omnibus в качестве эталона.Я пробежал valgrind ruby main.rb, и он не обнаружил никаких утечек.

1 Ответ

2 голосов
/ 06 мая 2019

Должен ли я передать строку обратно в Rust для освобождения?

Да.

Не будет ли сборщик мусора забрать это some_string и освободить его?

Да, но это не утечка памяти, о которой стоит беспокоиться. Сборщик мусора освободит память, выделенную Ruby, которая содержит преобразованную строку Ruby.

Однако сборщик мусора не знает о распределении , которое сделал Rust. В частности, код Rust может , а не даже сделать выделение. В этом случае, если вызывающий код освободил строку, это привело бы к небезопасной памяти, поэтому библиотека FFI не может предположить, что это char * было выделением.

Даже если бы он это сделал, он не знал бы, какой распределитель использовать для освобождения. Помните, что в умеренно сложном приложении часто используются несколько распределителей.

Отказ от ответственности: я автор Omnibus .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...