目录
- ✅ 一、C++ 中的 std::move 与指针复制的区别
- 🔹1. 指针复制:只是复制地址,不涉及资源所有权
- 🔹2. std::move:转移资源所有权(move语义)
- ✅ 总结:C++ 中 move vs. 指针复制
- ✅ 二、Rust 中的 move:所有权语义的核心机制
- 🔹Rust 的变量绑定是所有权机制
- 🔹Clone vs Move(Rust 等价于 C++ 的 copy vs move)
- ✅ 三、C++ move vs. Rust move:深入对比
- ✅ 四、图解资源在 move 过程中的变化(C++ vs Rust)
- C++:资源从 a 移动到 b
- Rust:资源所有权从 a 移动到 b
- Rust 编译器会阻止你再访问 a,C++ 则允许访问 a,但你自己要小心别出错。
- ✅ 五、总结
- 📎 参考文章
✅ 一、C++ 中的 std::move 与指针复制的区别#
🔹1. 指针复制:只是复制地址,不涉及资源所有权#
int* p1 = new int(42);
int* p2 = p1; // 指针复制:p1 和 p2 指向同一块内存
p1 和 p2 是两个指针变量,但它们都指向同一个内存地址。
- 如果你对
p2 做 delete 操作,然后再对 p1 做 delete,就会产生**双重释放(double free)**错误。
- 它不会涉及“资源所有权”的概念,只是内存地址的浅复制。
⚠️ 风险点:你要自己管理哪个指针该释放,容易出错,资源管理不安全。
🔹2. std::move:转移资源所有权(move语义)#
std::string s1 = "hello";
std::string s2 = std::move(s1); // 移动资源
// s1 的内容被转移走了,现在 s1 是一个有效但处于“空”状态的对象
std::move 是一种**“资源转移”语义**:不是复制字符串内容,而是把 s1 内部指针直接交给 s2。
- 之后
s1 不再拥有原始资源(它还在,但处于一种“被清空”的合法状态)。
- 避免了复制大对象,提高了性能,并且避免多次释放。
🧠 move 和智能指针(如
std::unique_ptr)结合使用能实现自动化资源转移和销毁。
✅ 总结:C++ 中 move vs. 指针复制#
✅ 二、Rust 中的 move:所有权语义的核心机制#
Rust 的 move 不只是一个操作,而是语言的核心内存模型。
🔹Rust 的变量绑定是所有权机制#
let s1 = String::from("hello");
let s2 = s1; // move 发生了!
// println!("{}", s1); // ❌ 编译错误!s1 的所有权已被移动到 s2
- Rust 不允许多个变量拥有同一份资源的“写权限”。
s1 被移动给了 s2,s1 不能再使用。
- 这是 Rust 的编译期资源安全保证机制,防止悬挂指针、双重释放等问题。
🔹Clone vs Move(Rust 等价于 C++ 的 copy vs move)#
let s1 = String::from("hello");
let s2 = s1.clone(); // 深拷贝
- 如果你想保留
s1,需要显式调用 .clone(),Rust 会做深复制。
- Rust 和 C++ 的
move 很相似,但 Rust 是编译器强制所有权转移的语义。
✅ 三、C++ move vs. Rust move:深入对比#
✅ 四、图解资源在 move 过程中的变化(C++ vs Rust)#
C++:资源从 a 移动到 b#
std::string a = "hello";
std::string b = std::move(a);
// 内存布局:
// a.data (now nullptr)
// b.data --> "hello"
Rust:资源所有权从 a 移动到 b#
let a = String::from("hello");
let b = a; // a 已无效
// 内存布局:
// a: 无效
// b: 拥有 "hello"
Rust 编译器会阻止你再访问 a,C++ 则允许访问 a,但你自己要小心别出错。#
✅ 五、总结#
📎 参考文章#