как я могу остановить утечку памяти в ржавчине 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);
    }
}

0 ответов

Другие вопросы по тегам