当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust from_raw_parts用法及代码示例


本文简要介绍rust语言中 Function std::slice::from_raw_parts 的用法。

用法

pub unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T]

从一个指针和一个长度形成一个切片。

len参数是数量元素,而不是字节数。

安全性

如果违反以下任何条件,则行为未定义:

  • 对于 len * mem::size_of::<T>() 多个字节的读取,data 必须是 valid,并且必须正确对齐。这尤其意味着:

    • 该切片的整个内存范围必须包含在单个分配的对象中!切片永远不能跨越多个分配的对象。请参阅下面的示例,错误地没有考虑到这一点。
    • data 必须为非空且对齐,即使对于零长度切片也是如此。这样做的一个原因是枚举布局优化可能依赖于对齐的引用(包括任何长度的切片)和非空值,以将它们与其他数据区分开来。您可以使用 NonNull::dangling() 获取可用作零长度切片的 data 的指针。
  • data 必须指向 len 类型为 T 的连续正确初始化的值。

  • 返回的切片引用的内存在 'a 的生命周期内不得发生突变,除了在 UnsafeCell 内。

  • 切片的总大小 len * mem::size_of::<T>() 不得大于 isize::MAX 。请参阅 pointer::offset 的安全文档。

警告

返回的切片的生命周期是从其使用情况中推断出来的。为了防止意外误用,建议将生命周期与上下文中安全的源生命周期联系起来,例如通过提供一个辅助函数来获取切片的主机值的生命周期,或者通过显式注释。

例子

use std::slice;

// manifest a slice for a single element
let x = 42;
let ptr = &x as *const _;
let slice = unsafe { slice::from_raw_parts(ptr, 1) };
assert_eq!(slice[0], 42);

使用不当

下列join_slices函数是不健全的⚠️

use std::slice;

fn join_slices<'a, T>(fst: &'a [T], snd: &'a [T]) -> &'a [T] {
    let fst_end = fst.as_ptr().wrapping_add(fst.len());
    let snd_start = snd.as_ptr();
    assert_eq!(fst_end, snd_start, "Slices must be contiguous!");
    unsafe {
        // The assertion above ensures `fst` and `snd` are contiguous, but they might
        // still be contained within _different allocated objects_, in which case
        // creating this slice is undefined behavior.
        slice::from_raw_parts(fst.as_ptr(), fst.len() + snd.len())
    }
}

fn main() {
    // `a` and `b` are different allocated objects...
    let a = 42;
    let b = 27;
    // ... which may nevertheless be laid out contiguously in memory: | a | b |
    let _ = join_slices(slice::from_ref(&a), slice::from_ref(&b)); // UB
}

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::slice::from_raw_parts。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。