Function std::slice::from_mut_ptr_range
const: unstable · source · pub unsafe fn from_mut_ptr_range<'a, T>(range: Range<*mut T>) -> &'a mut [T]
🔬This is a nightly-only experimental API. (
slice_from_ptr_range
#89792)Expand description
从指针范围形成一个分割切片。
这与 from_ptr_range
的功能相同,只是返回了一个不合法的切片。
此函数对于与外部接口进行交互很有用,该外部接口使用两个指针来引用内存中的一系列元素,这在 C++ 中很常见。
Safety
如果违反以下任一条件,则行为是未定义的:
-
范围的
start
指针必须是 valid 并正确对齐指向切片的第一个元素的指针。 -
end
指针必须是 valid 且正确对齐的指针,指向一个过去最后一个元素,这样从末尾到起始指针的偏移量就是切片的长度。 -
范围必须包含
N
类型T
的连续正确初始化值:- 该切片的整个存储范围必须包含在一个分配的对象中! 切片永远不能跨越多个分配的对象。
-
在生命周期
'a
的持续时间内,不得通过任何其他指针 (不是从返回值派生) 访问返回的切片引用的内存。 读取和写入访问均被禁止。 -
范围的总长度不得大于
isize::MAX
。 请参见pointer::offset
的安全文档。
请注意,从 slice::as_mut_ptr_range
创建的范围满足这些要求。
Panics
如果 T
是一个零大小的类型 (“ZST”),这个函数就会出现 panic。
Caveat
从使用中可以推断出返回切片的生命周期。 为防止意外滥用,建议将生命周期与生命周期中任何安全的来源联系起来,例如通过提供一个辅助函数,获取切片的宿主值的生命周期,或通过明确的注解法。
Examples
#![feature(slice_from_ptr_range)]
use core::slice;
let mut x = [1, 2, 3];
let range = x.as_mut_ptr_range();
unsafe {
assert_eq!(slice::from_mut_ptr_range(range), &mut [1, 2, 3]);
}
Run