本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。