0Pricing
C++ Academy · 课时

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 delete

get():借用原始指针

get() 返回原始指针,但不会放弃所有权。请将其用于不拥有所有权的互操作。

auto p = std::make_unique<int>(42);
legacy_api(p.get());      // p still owns it

unique_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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 智能指针为何取代原始 new 和 delete
  2. unique_ptr:独占所有权
  3. shared_ptr 与 weak_ptr:共享所有权
  4. 自定义删除器与 make 函数
← 返回 C++ Academy