Function core::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