智能指针为何取代原始 new 和 delete
理解 RAII,以及在现代 C++ 中拥有原始指针为何很少是正确做法
智能指针为何取代原始 new 和 delete 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
原始 new 和 delete
C 语言的继承方式是:new T 在堆上分配一个 T,delete 释放它。每个 new 必须恰好匹配一个 delete,否则就会发生内存泄漏或崩溃。
Widget* w = new Widget();
// ... use w ...
delete w; // forget this and you leak会出现什么问题
常见问题包括:
- 忘记使用
delete—— 内存泄漏 - 重复使用
delete—— 未定义行为 - 在
new和delete之间抛出异常 —— 内存泄漏 - 返回所有权不明确的原始指针
RAII 来帮忙
资源获取即初始化:将资源的生命周期与栈对象的生命周期绑定。即使抛出异常,析构函数也会释放资源。
智能指针的理念
智能指针是围绕原始指针构建的小型 RAII 封装。它的析构函数会调用 delete,因此您不会忘记释放资源。
三种智能指针
<memory> 中的标准库智能指针包括:
std::unique_ptr<T>—— 独占所有权std::shared_ptr<T>—— 通过引用计数共享所有权std::weak_ptr<T>—— shared_ptr 的非拥有观察者
智能指针开销很低
unique_ptr 没有额外开销(大小和速度都与原始指针相同)。shared_ptr 会产生少量原子引用计数开销。
不再手动使用 delete
使用智能指针后,您几乎不需要再编写 delete。析构函数会负责释放资源。
#include <memory>
std::unique_ptr<Widget> w = std::make_unique<Widget>();
// no delete needed — when w goes out of scope, Widget is destroyed智能指针与异常
如果函数执行到一半抛出异常,局部变量会按相反顺序销毁。智能指针会自动释放其资源,而原始指针则会造成内存泄漏。
类型中的所有权
现在,智能指针的类型会编码所有权信息。阅读函数签名就能知道对象由谁拥有。
// I take ownership
void consume(std::unique_ptr<Widget> w);
// I look but do not own
void inspect(const Widget& w);原始指针仍然存在
请使用原始指针(或引用)进行不拥有所有权的访问。它们传达的是“我在借用,而不是拥有”。
用 make 函数替代 new
请优先使用 std::make_unique(C++14)和 std::make_shared(C++11)。它们具有异常安全性,并且比直接调用 new 略高效。
auto w = std::make_unique<Widget>(42);
auto s = std::make_shared<Resource>("file.txt");快速检查
使用 std::unique_ptr 而不是原始的 new/delete 组合,主要原因是什么?
回顾
原始的 new/delete 容易出错。智能指针将堆上分配的对象封装在 RAII 句柄中,并自动释放资源。为安全性和性能考虑,请优先使用 std::make_unique 和 std::make_shared。
常见问题解答
「智能指针为何取代原始 new 和 delete」课时是免费的吗?
是的 — 「智能指针为何取代原始 new 和 delete」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「智能指针为何取代原始 new 和 delete」这节课中我会学到什么?
理解 RAII,以及在现代 C++ 中拥有原始指针为何很少是正确做法 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「智能指针为何取代原始 new 和 delete」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 智能指针为何取代原始 new 和 delete
- unique_ptr:独占所有权
- shared_ptr 与 weak_ptr:共享所有权
- 自定义删除器与 make 函数