как я могу остановить утечку памяти в ржавчине FFI?
Я пытаюсь создать некоторые привязки из библиотеки C для ржавчины с помощью bindgen, и все шло хорошо, пока я не понял, что у моей программы проблемы с утечкой памяти.
Благодаря heaptrack я смог определить функцию, вызывающую эти утечки памяти,
эта функцияCP56Time2a_createFromMsTimestamp
создает метку времени, которая затем добавляется в другую структуру (InformationObject
) перед отправкой, при отправке этой структуры вызывается метод, освобождающий память структуры (InformationObject_destroy
) и я думаю еще и память временной метки, в библиотеке нет способа освободить память временной метки
Как я могу освободить или освободить эту память? Результирующая структура функции представляет собой указатель*mut sCP56Time2a
минимальный пример того, что я делаю:
use iec60870::bindings;
use std::ffi::CString;
pub struct CP56Time2a;
impl CP56Time2a {
pub fn create() -> *mut bindings::sCP56Time2a {
unsafe {
bindings::CP56Time2a_createFromMsTimestamp(
std::ptr::null_mut(),
bindings::Hal_getTimeInMs(),
)
}
}
}
pub struct Slave {
inner: bindings::CS104_Slave,
}
impl Slave {
pub fn new(addr: &str, port: i32) -> Self {
let inner = unsafe {
let inner = bindings::CS104_Slave_create(100, 100);
let address = CString::new(addr).unwrap().as_c_str().to_owned();
bindings::CS104_Slave_setLocalAddress(inner, address.as_ptr());
bindings::CS104_Slave_setLocalPort(inner, port);
bindings::CS104_Slave_setServerMode(inner, 1);
inner
};
Self { inner }
}
}
fn main() {
unsafe {
let slave = Slave::new("127.0.0.1", 2404);
let param = bindings::CS104_Slave_getAppLayerParameters(slave.inner);
let asdu = bindings::CS101_ASDU_create(param, false, 3, 0, 1, false, false);
let timestamp = CP56Time2a::create();
let me = bindings::MeasuredValueScaledWithCP56Time2a_create(
std::ptr::null_mut(),
1000,
20,
0,
timestamp,
);
bindings::CS101_ASDU_addInformationObject(asdu, me as bindings::InformationObject);
// send asdu
bindings::InformationObject_destroy(me as bindings::InformationObject);
bindings::CS101_ASDU_destroy(asdu);
}
}