fix markdown format error

pull/278/head
sunface 3 years ago
parent 44a6044a0f
commit ec9c52fba3

@ -310,22 +310,22 @@ error[E0277]: `PhantomPinned` cannot be unpinned
> 需要注意的是固定在栈上非常依赖于你写出的 `unsafe` 代码的正确性。我们知道 `&'a mut T` 可以固定的生命周期是 `'a` ,但是我们却不知道当生命周期 `'a` 结束后,该指针指向的数据是否会被移走。如果你的 `unsafe` 代码里这么实现了,那么就会违背 `Pin` 应该具有的作用! > 需要注意的是固定在栈上非常依赖于你写出的 `unsafe` 代码的正确性。我们知道 `&'a mut T` 可以固定的生命周期是 `'a` ,但是我们却不知道当生命周期 `'a` 结束后,该指针指向的数据是否会被移走。如果你的 `unsafe` 代码里这么实现了,那么就会违背 `Pin` 应该具有的作用!
> >
> 一个常见的错误就是忘记去遮蔽(shadow )初始的变量,因为你可以 `drop``Pin` ,然后在 `&'a mut T` 结束后去移动数据: > 一个常见的错误就是忘记去遮蔽(shadow )初始的变量,因为你可以 `drop``Pin` ,然后在 `&'a mut T` 结束后去移动数据:
>
> ```rust ```rust
> pub fn main() { pub fn main() {
> let mut test1 = Test::new("test1"); let mut test1 = Test::new("test1");
> let mut test1 = unsafe { Pin::new_unchecked(&mut test1) }; let mut test1 = unsafe { Pin::new_unchecked(&mut test1) };
> Test::init(test1.as_mut()); Test::init(test1.as_mut());
>
> let mut test2 = Test::new("test2"); let mut test2 = Test::new("test2");
> let mut test2 = unsafe { Pin::new_unchecked(&mut test2) }; let mut test2 = unsafe { Pin::new_unchecked(&mut test2) };
> Test::init(test2.as_mut()); Test::init(test2.as_mut());
>
> println!("a: {}, b: {}", Test::a(test1.as_ref()), Test::b(test1.as_ref())); println!("a: {}, b: {}", Test::a(test1.as_ref()), Test::b(test1.as_ref()));
> std::mem::swap(test1.get_mut(), test2.get_mut()); std::mem::swap(test1.get_mut(), test2.get_mut());
> println!("a: {}, b: {}", Test::a(test2.as_ref()), Test::b(test2.as_ref())); println!("a: {}, b: {}", Test::a(test2.as_ref()), Test::b(test2.as_ref()));
>} }
>``` ```
#### 固定到堆上 #### 固定到堆上
将一个 `!Unpin` 类型的值固定到堆上,会给予该值一个稳定的内存地址,它指向的堆中的值在 `Pin` 后是无法被移动的。而且与固定在栈上不同,我们知道堆上的值在整个生命周期内都会被稳稳地固定住。 将一个 `!Unpin` 类型的值固定到堆上,会给予该值一个稳定的内存地址,它指向的堆中的值在 `Pin` 后是无法被移动的。而且与固定在栈上不同,我们知道堆上的值在整个生命周期内都会被稳稳地固定住。

Loading…
Cancel
Save