相关疑难解决方法(0)

带有C字符串的静态结构,用于lv2插件

我正在尝试学习Rust(低级编程中的新手),并希望将一个小的lv2放大器(音频)插件"amp.c"(C代码)从C转换为Rust.我实际上让它工作(这里),但是当主机终止时,valgrind说"1个块中的64个字节肯定会丢失".我想我知道为什么会这样,但我不知道如何解决它.

在你厌倦阅读之前,这是最后一个问题:

如何静态分配包含C字符串的结构?

以下是介绍:

为什么会发生(我认为): 主机加载库并调用lv2_descriptor()

const LV2_Descriptor*
lv2_descriptor()
{
    return &descriptor;
}
Run Code Online (Sandbox Code Playgroud)

它返回一个指向STATICALLY分配的LV2_Descriptor类型结构的指针,

static const LV2_Descriptor descriptor = {
    AMP_URI,
    ...
};
Run Code Online (Sandbox Code Playgroud)

被定义为

typedef struct _LV2_Descriptor {
    const char * URI;
    ...
} LV2_Descriptor;
Run Code Online (Sandbox Code Playgroud)

为什么静态分配?在amp.c中它说:

最好静态定义描述符,以避免泄漏内存和非可移植共享库构造函数和析构函数以正确清理.

但是,我将lv2_descriptor()翻译为Rust:

#[no_mangle]
pub extern fn lv2_descriptor(index:i32) -> *const LV2Descriptor {
     let s = "http://example.org/eg-amp_rust";
     let cstr = CString::new(s).unwrap();
     let ptr = cstr.as_ptr();
     mem::forget(cstr);

     let mybox = Box::new(LV2Descriptor{amp_uri: ptr}, ...);
     let bxptr = &*mybox as *const LV2Descriptor; 
     mem::forget(mybox);
     return  bxptr …
Run Code Online (Sandbox Code Playgroud)

audio static rust

6
推荐指数
1
解决办法
149
查看次数

标签 统计

audio ×1

rust ×1

static ×1