當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。