• 裸指针
    • 使用

    裸指针

    Rust通过限制智能指针的行为保障了编译时安全,不过仍需要对指针做一些额外的操作。

    *const T*mut TRust中被称为“裸指针”。它允许别名,允许用来写共享所有权的类型,甚至是内存安全的共享内存类型如:Rc<T>Arc<T>,但是赋予你更多权利的同时意味着你需要担当更多的责任:

    • 不能保证指向有效的内存,甚至不能保证是非空的
    • 没有任何自动清除,所以需要手动管理资源
    • 是普通旧式类型,也就是说,它不移动所有权,因此Rust编译器不能保证不出像释放后使用这种bug
    • 缺少任何形式的生命周期,不像&,因此编译器不能判断出悬垂指针
    • 除了不允许直接通过*const T改变外,没有别名或可变性的保障

    使用

    创建一个裸指针:

    1. let a = 1;
    2. let b = &a as *const i32;
    3. let mut x = 2;
    4. let y = &mut x as *mut i32;

    解引用需要在unsafe中进行:

    1. let a = 1;
    2. let b = &a as *const i32;
    3. let c = unsafe { *b };
    4. println!("{}", c);

    Box<T>into_raw

    1. let a: Box<i32> = Box::new(10);
    2. // 我们需要先解引用a,再隐式把 & 转换成 *
    3. let b: *const i32 = &*a;
    4. // 使用 into_raw 方法
    5. let c: *const i32 = Box::into_raw(a);

    如上说所,引用和裸指针之间可以隐式转换,但隐式转换后再解引用需要使用unsafe

    1. // 显式
    2. let a = 1;
    3. let b: *const i32 = &a as *const i32; //或者let b = &a as *const i32;
    4. // 隐式
    5. let c: *const i32 = &a;
    6. unsafe {
    7. println!("{}", *c);
    8. }