unique_ptr:独占所有权
使用 unique_ptr 和仅可移动类型表达单一所有者语义
unique_ptr:独占所有权 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
单一所有者智能指针
std::unique_ptr<T> 拥有一个堆对象。当 unique_ptr 被销毁时,它会删除该对象。它不能复制,只能移动。
创建 unique_ptr
请使用 std::make_unique(C++14),它既具有异常安全性,又简洁明了。
#include <memory>
auto w = std::make_unique<Widget>(); // default-constructed
auto p = std::make_unique<Point>(3, 4); // forwarded args像使用指针一样使用它
unique_ptr 支持常见的指针操作。
auto p = std::make_unique<Point>(3, 4);
std::cout << p->x; // arrow access
std::cout << (*p).y; // dereference
if (p) std::cout << "non-null";不能复制,但可以移动
复制会产生两个所有者,这违反了“唯一”的含义。移动操作会转移所有权。
std::unique_ptr<int> a = std::make_unique<int>(1);
std::unique_ptr<int> b = std::move(a);
// a is now empty, b owns the int传递给函数
按值传递(结合 std::move):转移所有权。按引用传递:借用对象但不拥有所有权。
void consume(std::unique_ptr<Widget> w); // takes ownership
void inspect(const Widget& w); // borrows
auto w = std::make_unique<Widget>();
consume(std::move(w));
// w is now empty
inspect(*w); // (after re-creating)从函数返回
如果函数负责分配对象并返回其所有权,就应该返回 std::unique_ptr。
std::unique_ptr<Widget> create() {
return std::make_unique<Widget>();
}重置和释放
reset() 会删除当前对象,并可选择接管新对象的所有权。release() 会放弃所有权并返回原始指针。
auto p = std::make_unique<int>(10);
p.reset(new int(20)); // delete the old, own the new
int* raw = p.release(); // p is now empty
delete raw; // caller must deleteget():借用原始指针
get() 返回原始指针,但不会放弃所有权。请将其用于不拥有所有权的互操作。
auto p = std::make_unique<int>(42);
legacy_api(p.get()); // p still owns itunique_ptr 与数组
对于数组,请使用 unique_ptr<T[]>。可以使用 [] 进行索引访问;对象销毁时会调用 delete[]。
auto arr = std::make_unique<int[]>(10);
arr[0] = 99;
std::cout << arr[0];自定义删除器
当资源不是原始内存(例如文件句柄、OS 资源)时,请将自定义删除器作为模板参数提供。
auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(std::fopen("a.txt","r"), closer);性能
使用默认删除器时,unique_ptr 的大小和速度都与原始指针相同,没有额外开销。
快速检查
为什么 std::unique_ptr 禁止复制?
回顾
std::unique_ptr 是默认的智能指针:没有额外开销,具有独占所有权,可以移动但不能复制。创建对象时,请优先使用 std::make_unique。
常见问题解答
「unique_ptr:独占所有权」课时是免费的吗?
是的 — 「unique_ptr:独占所有权」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「unique_ptr:独占所有权」这节课中我会学到什么?
使用 unique_ptr 和仅可移动类型表达单一所有者语义 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「unique_ptr:独占所有权」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。