字符串通过FFI从rust到ruby变为空

字符串通过FFI从rust到ruby变为空,ruby,rust,ffi,Ruby,Rust,Ffi,我有一个rubygem,带有一个用rust编写的本地扩展名 本机扩展支持将其数据结构序列化为JSON 然而,虽然我已经确认它正在生成JSON,但ruby端的字符串总是空的 以下是ruby代码: 模块和布谷鸟过滤器 扩展FFI::库 ffi_lib‘libbuckoofilter_cabi’ 类实例*常量C_字符{ 让filter=unsafe{filter.as_mut()}; 让serialized=serde_json::to_string(&filter.expect(“给定的rcf_布谷

我有一个rubygem,带有一个用rust编写的本地扩展名

本机扩展支持将其数据结构序列化为JSON

然而,虽然我已经确认它正在生成JSON,但ruby端的字符串总是空的

以下是ruby代码:

模块和布谷鸟过滤器
扩展FFI::库
ffi_lib‘libbuckoofilter_cabi’
类实例
还有防锈代码

///将筛选器导出到文件
#[没有损坏]
pub extern“C”fn rcf_buckoofilter_导出(过滤器:*多个rcf_buckoofilter)->*常量C_字符{
让filter=unsafe{filter.as_mut()};
让serialized=serde_json::to_string(&filter.expect(“给定的rcf_布谷鸟过滤器*是空指针”).export()).unwrap();
让cstr=CString::new(序列化).expect(“JSON不是有效的c字符串”);
设ptr=cstr.as_ptr();
不安全{
println!(“{:?}”,ptr);
println!(“{}”,CStr::from_ptr(ptr).to_str().expect(“validity”);
}
ptr
}
在生锈的一面,
println使用确认指针包含JSON字符串

通过将它打印的地址与ruby中的返回值
#export
进行比较,我可以看出使用了相同的指针

但是,在指针上调用
get_bytes(0,10)
会显示它以空字节开始,并且尝试将其转换为字符串会返回空字符串


我怀疑它被归零了,因为变量生命周期已经结束,我正在调试模式下构建;然而,我不清楚我需要改变什么。

解决了它-我需要在生锈的一面使用
CString::into_raw
,以防止它被清理干净。

如果你给了所有权是的,不要忘了要释放内存,你必须在某个时候使用更多信息:可能的