Pointers 引用的静态变量中的值错误
我试图从WebAssembly模块中更新rust中的静态变量,该模块本身是用rust编写的 为了设置变量,我编写了一个函数Pointers 引用的静态变量中的值错误,pointers,memory,rust,static,webassembly,Pointers,Memory,Rust,Static,Webassembly,我试图从WebAssembly模块中更新rust中的静态变量,该模块本身是用rust编写的 为了设置变量,我编写了一个函数init,并将其导出到WASM模块: static mut FILE_NAME:&str=”“; #[没有损坏] pub fn init(模型路径:*mut c_char){ let path=unsafe{CStr::from_ptr(model_path).to_str().unwrap()}; 不安全{ 文件名=路径; println!(“{}”,文件名); } }
init
,并将其导出到WASM模块:
static mut FILE_NAME:&str=”“;
#[没有损坏]
pub fn init(模型路径:*mut c_char){
let path=unsafe{CStr::from_ptr(model_path).to_str().unwrap()};
不安全{
文件名=路径;
println!(“{}”,文件名);
}
}
然后我尝试从另一个导出的函数中访问它load\u model
:
#[无损坏]
pub fn load_model()->*mut c_char{
让path=unsafe{&FILE_NAME};
println!(“{}”,路径);
//东西。。。
}
当使用指向“/lib/python/iris\u knn.model”
的指针作为参数调用init
函数,然后调用load\u model
函数时,我会打印以下行:
lib/python/iris_knn.model
?4?on/iknn.mode
这当然不是我所期望的。这里有什么问题
顺便说一句,我知道这是一种不好的做法,但我更多地将其视为一种学习。感谢@Cerberus的评论,我发现了自己的错误。在调用
init
之后,我立即释放了与传递的字符串关联的内存。从load\u model
访问时,内存已释放且不再有效
以下是正确的主机运行时代码的摘录:
#。。。
实例=实例(模块、导入对象)
(file_ptr,file_len)=获取字符串_ptr('/lib/python/iris_knn.model',实例)
instance.exports.init(文件\u ptr)
#下一行错误,需要删除
#exports.deallocate(文件\ptr,文件\u len)
def load_模型():
output\u ptr=instance.exports.load\u model()
(output,output_len)=从_ptr获取_字符串(output_ptr,实例)
实例.exports.deallocate(输出\u ptr,输出\u len)
返回输出
字符串存储在哪里?当您调用load\u model
时,它必须处于活动状态,这才是正确的提示。调用init
后,我立即释放了与字符串关联的内存,因此在load\u model
时它不再有效。谢谢!