如何为函数内创建的数组返回切片(以干净的 Rust 方式)

问题描述 投票:0回答:1

这个问题可能已经被问过很多次了,抱歉。

我想创建一个创建字节数组并向其返回切片的函数,并且仅使用生命周期。

我不关心字节数组是如何创建的,但它需要一个初始大小,并且它将被接收未大小数组的函数改变。该函数应该返回一个未确定大小的数组(因为实际上我不知道函数开始时数组的大小是多少

fn create_new_byte_array(v :&[u8]) -> Result<&[u8], io::Error> {
    const N: usize = 1500;
    //let mut result: Vec<u8> = Vec::<_>::with_capacity(N);
    let mut result: [u8; N] = [0; N];
    // builder.write(&mut result.as_mut_slice(), v); // some byte transform
    return Ok(&result.as_slice());
}

如何以 Rust 方式完成此操作?对于菜鸟来说,任何有关其他细节的提示都欢迎。

rust lifetime
1个回答
0
投票

通常不能返回引用在这样的函数中创建的数据的切片的原因是根本性的,并且在不允许内存泄漏的情况下没有办法绕过它。

切片只是内存中存储的一些数据的视图。它是对数组的引用。但数组本身位于哪里?如果您使用

Vec
创建它,则该数组位于堆上,您需要管理其所有权。当
Vec
超出范围时,它将被删除,并且其内容将无效。

如果在函数中将数组创建为局部变量,那么它会在堆栈上分配,并且当函数返回时它将不再存在。

如果您想返回引用函数内创建的数据的切片,那么您需要故意创建内存泄漏,但确保一旦返回引用,所引用的数据就永远不会被释放。

fn main() {
    let slice1 = make_slice(55);
    let slice2 = make_slice(66);
    println!("slice 1: {slice1:?}");
    println!("slice 2: {slice2:?}");
    // Note that slice1 and slice2 will never be freed since we called Vec::leak
}

fn make_slice(n: u8) -> &'static [u8] {
    let v = vec![n; 10];
    
    // The 'static lifetime means the referred-to data needs to be guaranteed to
    // live for the rest of the program's execution.
    v.leak()  // <-- data will NEVER be freed, we return a reference to this data
}
© www.soinside.com 2019 - 2024. All rights reserved.