当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust Vec.set_len用法及代码示例


本文简要介绍rust语言中 std::vec::Vec.set_len 的用法。

用法

pub unsafe fn set_len(&mut self, new_len: usize)

将向量的长度强制为 new_len

这是一个低级操作,不维护该类型的任何正常不变量。通常使用安全操作之一来更改向量的长度,例如 truncate resize extend clear

安全性

  • new_len 必须小于或等于 capacity()
  • old_len..new_len 处的元素必须被初始化。

例子

此方法对于向量用作其他代码的缓冲区的情况非常有用,特别是在 FFI 上:

pub fn get_dictionary(&self) -> Option<Vec<u8>> {
    // Per the FFI method's docs, "32768 bytes is always enough".
    let mut dict = Vec::with_capacity(32_768);
    let mut dict_length = 0;
    // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
    // 1. `dict_length` elements were initialized.
    // 2. `dict_length` <= the capacity (32_768)
    // which makes `set_len` safe to call.
    unsafe {
        // Make the FFI call...
        let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);
        if r == Z_OK {
            // ...and update the length to what was initialized.
            dict.set_len(dict_length);
            Some(dict)
        } else {
            None
        }
    }
}

虽然以下示例是合理的,但由于在 set_len 调用之前未释放内部向量,因此存在内存泄漏:

let mut vec = vec![vec![1, 0, 0],
                   vec![0, 1, 0],
                   vec![0, 0, 1]];
// SAFETY:
// 1. `old_len..0` is empty so no elements need to be initialized.
// 2. `0 <= capacity` always holds whatever `capacity` is.
unsafe {
    vec.set_len(0);
}

通常,在这里,人们会使用 clear 来正确删除内容,从而不会泄漏内存。

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 std::vec::Vec.set_len。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。