当我尝试使用nightly编译器编译以下代码时,出现错误:
#![feature(alloc)]
#![feature(unique)]
#![feature(heap_api)]
extern crate alloc;
use std::ptr::{Unique, self};
use alloc::heap;
use std::mem;
fn main() {
unsafe {
let align = mem::align_of::<i32>();
let elem_size = mem::size_of::<i32>();
let ptr = heap::allocate(elem_size*5, align);
let a = Unique::new(ptr as *mut _);
println!("{}", *a.offset(2));
}
}
错误:
rustc 1.19.0-nightly (5de00925b 2017-05-29)
error: no method named `offset` found for type `std::ptr::Unique<_>` in the current scope
--> <anon>:16:27
|
16 | println!("{}", *a.offset(2));
| ^^^^^^
根据docs,应为offset
定义Unique
。我做错了什么?
答案 0 :(得分:4)
与正在使用的代码相比,您正在阅读过时的文档。最新的夜间API可以在https://doc.rust-lang.org/nightly/std/ptr/struct.Unique.html找到。
以前,Unique
通过.offset()
特征获得Deref
方法*mut T
。此Deref
impl已在2017 May 6th上删除,因为
主要区别在于我删除了
Deref
impl,因为显然 LLVM无法使用&ptr -> &ptr
API 维护元数据。这被认为是阻止这种API稳定的阻滞剂。无论如何,这不符合人体工程学。
现在要获得*mut T
,请致电.as_ptr()
。这是一个值到值,而不是引用参考函数,因此可以解决LLVM问题。
println!("{}", *a.as_ptr().offset(2));
// ^~~~~~~~