// 此函数取倒堆分配的内存的所有权
fn destroy_box(c: Box<i32>) {
println!("Destroying a box that contains {}", c);
// `c` 被销毁且内存得到释放
}
fn main() {
// 栈分配的整型
let x = 5u32;
// 将 `x` **复制**(*Copy*)到 `y`——不存在资源移动
let y = x;
// 两个值都可以独立地使用
println!("x is {}, and y is {}", x, y);
// `a` 是一个指向堆分配的整型的指针
let a = Box::new(5i32);
println!("a contains: {}", a);
// **移动**(*Move*) `a` 到 `b`
let b = a;
// 把 `a` 的指针地址(非数据)复制到 `b`。现在两者都是指向
// 同一个堆分配的数据,但是现在是 `b` 占有它。
// 报错!`a` 再也不能访问数据,因为它不再拥有堆上的内存。
println!("a contains: {}", a);
// 试一试 ^ 将此行注释去掉
// 此函数从 `b` 中取得栈分配的内存的所有权
//destroy_box(b);
// 此时堆上的内存已经释放掉,而这个操作会导致解引用已释放的内存,
// 但这种情况会被编译器会禁止。
// 报错!和前面出错的原因一样。
//println!("b contains: {}", b);
// 试一试 ^ 将此行注释去掉
}
Compiling own v0.1.0 (/data2/rust/move)
warning: unused variable: `b`
--> src/main.rs:24:9
|
24 | let b = a;
| ^ help: if this is intentional, prefix it with an underscore: `_b`
|
= note: `#[warn(unused_variables)]` on by default
error[E0382]: borrow of moved value: `a`
--> src/main.rs:29:32
|
19 | let a = Box::new(5i32);
| - move occurs because `a` has type `std::boxed::Box<i32>`, which does not implement the `Copy` trait
...
24 | let b = a;
| - value moved here
...
29 | println!("a contains: {}", a);
| ^ value borrowed here after move
error: aborting due to previous error; 1 warning emitted
For more information about this error, try `rustc --explain E0382`.
error: could not compile `own`.
To learn more, run the command again with --verbose.
cat src/main.rs
// 此函数取倒堆分配的内存的所有权
fn destroy_box(c: Box<i32>) {
println!("Destroying a box that contains {}", c);
// `c` 被销毁且内存得到释放
}
fn main() {
// 栈分配的整型
let x = 5u32;
// 将 `x` **复制**(*Copy*)到 `y`——不存在资源移动
let y = x;
// 两个值都可以独立地使用
println!("x is {}, and y is {}", x, y);
// `a` 是一个指向堆分配的整型的指针
let a = Box::new(5i32);
println!("a contains: {}", a);
// **移动**(*Move*) `a` 到 `b`
let b = a;
// 把 `a` 的指针地址(非数据)复制到 `b`。现在两者都是指向
// 同一个堆分配的数据,但是现在是 `b` 占有它。
// 报错!`a` 再也不能访问数据,因为它不再拥有堆上的内存。
//println!("a contains: {}", a);
// 试一试 ^ 将此行注释去掉
// 此函数从 `b` 中取得栈分配的内存的所有权
destroy_box(b);
// 此时堆上的内存已经释放掉,而这个操作会导致解引用已释放的内存,
// 但这种情况会被编译器会禁止。
// 报错!和前面出错的原因一样。
//println!("b contains: {}", b);
// 试一试 ^ 将此行注释去掉
}
[root@bogon move]# cargo build
Compiling own v0.1.0 (/data2/rust/move)
Finished dev [unoptimized + debuginfo] target(s) in 0.39s
[root@bogon move]# cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/own`
x is 5, and y is 5
a contains: 5
Destroying a box that contains 5
cat src/main.rs
// 此函数取倒堆分配的内存的所有权
fn destroy_box(c: Box<i32>) {
println!("Destroying a box that contains {}", c);
// `c` 被销毁且内存得到释放
}
fn main() {
// 栈分配的整型
let x = 5u32;
// 将 `x` **复制**(*Copy*)到 `y`——不存在资源移动
let y = x;
// 两个值都可以独立地使用
println!("x is {}, and y is {}", x, y);
// `a` 是一个指向堆分配的整型的指针
let a = Box::new(5i32);
println!("a contains: {}", a);
// **移动**(*Move*) `a` 到 `b`
let b = a;
// 把 `a` 的指针地址(非数据)复制到 `b`。现在两者都是指向
// 同一个堆分配的数据,但是现在是 `b` 占有它。
// 报错!`a` 再也不能访问数据,因为它不再拥有堆上的内存。
//println!("a contains: {}", a);
// 试一试 ^ 将此行注释去掉
// 此函数从 `b` 中取得栈分配的内存的所有权
destroy_box(b);
// 此时堆上的内存已经释放掉,而这个操作会导致解引用已释放的内存,
// 但这种情况会被编译器会禁止。
// 报错!和前面出错的原因一样。
println!("b contains: {}", b);
// 试一试 ^ 将此行注释去掉
}
Compiling own v0.1.0 (/data2/rust/move)
error[E0382]: borrow of moved value: `b`
--> src/main.rs:38:32
|
24 | let b = a;
| - move occurs because `b` has type `std::boxed::Box<i32>`, which does not implement the `Copy` trait
...
33 | destroy_box(b);
| - value moved here
...
38 | println!("b contains: {}", b);
| ^ value borrowed here after move
error: aborting due to previous error
For more information about this error, try `rustc --explain E0382`.
error: could not compile `own`.
To learn more, run the command again with --verbose.
[root@bogon move]#