加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSS
您当前的位置:首页 > 学习资料

如何解决rust 无法返回阴影临时值得错误?

时间:2023-02-13 00:30:54  来源:原创  作者:站长

如何解决rust 无法返回阴影临时值得错误?

pub fn u8tostr (t: [u8;1024]) -> &'static str {
    std::str::from_utf8(&t.clone()).unwrap()
}

这里我传入一个u8的数组 然后把数组转为 str最后返回这个值。bSO华陈数据科技

error[E0515]: cannot return value referencing temporary value
   --> src\main.rs:462:5
    |
462 |     std::str::from_utf8(&t.clone()).unwrap()
    |     ^^^^^^^^^^^^^^^^^^^^^---------^^^^^^^^^^
    |     |                    |
    |     |                    temporary value created here
    |     returns a value referencing data owned by the current function

但 一直报错说 t 是临时创建的值 返回的一个值引用了临时的值!bSO华陈数据科技

一直搞不懂这是什么问题!bSO华陈数据科技

这是一个工具函数用来转换数组内的信息到文本 然后打印并返回值bSO华陈数据科技
bSO华陈数据科技
解决方法:bSO华陈数据科技
bSO华陈数据科技
 bSO华陈数据科技

因为你无法通过没有所有权的变量来得到一个全局生命周期的引用呀...bSO华陈数据科技

算了,且让我教你一招:bSO华陈数据科技

bSO华陈数据科技
pub fn u8tostr(t: [u8; 1024] ) -> &'static str {bSO华陈数据科技
          Box::leak(bSO华陈数据科技
                String::from_utf8_lossy(&t).into_owned().into_boxed_str()bSO华陈数据科技
          )bSO华陈数据科技
}bSO华陈数据科技
bSO华陈数据科技
 bSO华陈数据科技

可应急用,风险自负 )bSO华陈数据科技
-------------------------------------------------------------------------------bSO华陈数据科技
bSO华陈数据科技
解决方法2:bSO华陈数据科技
bSO华陈数据科技
 bSO华陈数据科技

报错信息很直白了... 你在尝试返回一个已释放对象的引用(野指针)bSO华陈数据科技

t.clone()产生的临时变量仅在这行语句内生存,from_utf8的返回值引用了它,所以也只在这行语句内生存,自然不能传到函数外面去bSO华陈数据科技

直接&t也不行,t是函数参数,只在函数体内生存,对它的引用也不能传出去bSO华陈数据科技

你可以传入引用,避免出现临时变量bSO华陈数据科技

pub fn u8tostr(t: &[u8; 1024]) -> &str {
    std::str::from_utf8(&t).unwrap()
}

或者返回一个 owned stringbSO华陈数据科技
 bSO华陈数据科技

pub fn u8tostr(t: [u8; 1024]) -> String {
    std::str::from_utf8(&t).unwrap().to_string()
}

 bSO华陈数据科技

来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
实现php间隔一段时间执行一次某段代码
实现php间隔一段时间
相关文章
    无相关信息
栏目更新
栏目热门