當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust Vec.from_raw_parts用法及代碼示例


本文簡要介紹rust語言中 std::vec::Vec.from_raw_parts 的用法。

用法

pub unsafe fn from_raw_parts(    ptr: *mut T,     length: usize,     capacity: usize) -> Vec<T, Global>

直接從另一個向量的原始分量創建 Vec<T>

安全性

由於未檢查的不變量的數量,這是非常不安全的:

  • ptr 需要先前已通過 String /Vec<T> 分配(至少,如果不是,它很可能是不正確的)。
  • T 需要與 ptr 分配的大小和對齊方式相同。 (T 具有不太嚴格的對齊方式是不夠的,對齊方式確實需要滿足 dealloc 要求,即必須使用相同的布局分配和釋放內存。)
  • length 需要小於或等於 capacity
  • capacity 需要是分配指針的容量。

違反這些可能會導致問題,例如損壞分配器的內部數據結構。例如它是不是安全地建立一個Vec<u8>從指針到 Cchar有長度的數組size_t。從 a 構建一個也不安全Vec<u16>及其長度,因為分配器關心對齊方式,而這兩種類型具有不同的對齊方式。緩衝區以對齊方式 2 分配(對於u16),但是將其變成Vec<u8>它將通過對齊方式 1 被釋放。

ptr 的所有權有效地轉移到Vec<T>,然後可以隨意釋放、重新分配或更改指針指向的內存內容。確保調用此函數後沒有其他任何東西使用該指針。

例子

use std::ptr;
use std::mem;

let v = vec![1, 2, 3];

// Prevent running `v`'s destructor so we are in complete control
// of the allocation.
let mut v = mem::ManuallyDrop::new(v);

// Pull out the various important pieces of information about `v`
let p = v.as_mut_ptr();
let len = v.len();
let cap = v.capacity();

unsafe {
    // Overwrite memory with 4, 5, 6
    for i in 0..len as isize {
        ptr::write(p.offset(i), 4 + i);
    }

    // Put everything back together into a Vec
    let rebuilt = Vec::from_raw_parts(p, len, cap);
    assert_eq!(rebuilt, [4, 5, 6]);
}

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 std::vec::Vec.from_raw_parts。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。