本文簡要介紹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 Vec.swap_remove用法及代碼示例
- Rust Vec.shrink_to_fit用法及代碼示例
- Rust Vec.splice用法及代碼示例
- Rust Vec.split_off用法及代碼示例
- Rust Vec.split_at_spare_mut用法及代碼示例
- Rust Vec.spare_capacity_mut用法及代碼示例
- Rust Vec.shrink_to用法及代碼示例
- Rust Vec.drain用法及代碼示例
- Rust Vec.into_raw_parts用法及代碼示例
- Rust Vec.resize用法及代碼示例
- Rust Vec.is_empty用法及代碼示例
- Rust Vec.reserve_exact用法及代碼示例
- Rust Vec.retain_mut用法及代碼示例
- Rust Vec.try_reserve_exact用法及代碼示例
- Rust Vec.new_in用法及代碼示例
- Rust Vec.insert用法及代碼示例
- Rust Vec.retain用法及代碼示例
- Rust Vec.with_capacity用法及代碼示例
- Rust Vec.from_raw_parts用法及代碼示例
- Rust Vec.into_boxed_slice用法及代碼示例
- Rust Vec.reserve用法及代碼示例
- Rust Vec.dedup_by用法及代碼示例
- Rust Vec.as_mut_slice用法及代碼示例
- Rust Vec.dedup用法及代碼示例
- Rust Vec.as_ptr用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 std::vec::Vec.set_len。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。