我有两个u8
的静态数组,我将实现一个将它们串联的函数。像这样
fn concat_u8(first: &'static [u8], second: &'static [u8]) -> &'static [u8] {
&[&first[..], &second[..]].concat()
}
编译器向我显示错误returns a reference to data owned by the current function
。那是因为分配的内存将在函数结束时释放。
我如何“强制”寿命为静态?
修改
我的过程很长。
在开始时,该过程处理一些输入以计算结果(即concat_u8
函数)。结果是u8
的数组,将在剩余的过程寿命中以只读方式使用。
在内部“ concat_u8
事件之后,无法调用函数start
。
我不希望使用Box
,因为动态分配会带来一些开销(也许无法衡量?),并将结果存储为&[u8]
。
我有机会这样做吗?
我是否有机会不使用unsafe
块来做到这一点?
答案 0 :(得分:4)
在不泄漏内存的情况下,不可能将两个切片连接到具有静态生存期的新切片。
切片连续存储在内存中。将两个切片与静态生存期串联起来需要将它们复制到新分配的内存中,因为结果还需要连续。新分配的内存必须由当前函数拥有,因此您不能返回对其的引用。
您将必须将内存的所有权转移回调用者:
pub fn concat_u8(first: &[u8], second: &[u8]) -> Vec<u8> {
[first, second].concat()
}
不再需要输入具有静态生存期,并且可能根本不需要实现此功能,因为调用它不会比简单地内联代码短或清晰。