nullptr 与空指针安全
使用 nullptr 代替 NULL 或 0,并防止对空指针解引用
nullptr 与空指针安全 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
什么是空指针
空指针是一种指向“任何对象都没有”的特殊值。对它进行解引用属于未定义行为,通常会因段错误而崩溃。
现代 C++ 中的 nullptr
从 C++11 开始,关键字 nullptr 表示一个带类型的空指针字面量。请优先使用它,而不是 NULL 或 0。
int* p1 = nullptr;
int* p2 = NULL; // legacy macro
int* p3 = 0; // legacy literal为什么使用 nullptr
NULL 只是 0 的一个宏。它可能导致 int 和 int* 之间的重载解析产生歧义。nullptr 具有唯一类型 std::nullptr_t。
void f(int);
void f(int*);
f(NULL); // calls f(int) -- surprising!
f(nullptr); // calls f(int*) -- correct检查空指针
指针可以隐式转换为 bool:非空时为真,空时为假。
if (p) std::cout << "has value\n";
if (!p) std::cout << "is null\n";
if (p != nullptr) std::cout << "explicit form\n";始终初始化
未初始化的指针包含垃圾值,仿佛指向某个位置。请始终初始化指针,即使只是将其初始化为 nullptr。
int* p; // BAD: undefined contents
int* q = nullptr; // GOOD解引用空指针
通过空指针读取或写入属于未定义行为。在大多数桌面系统上会触发段错误;在嵌入式设备上则可能悄无声息地破坏内存。
防御性检查
在公共 API 中,或调用方可能传入空指针时,请在解引用之前进行检查。
void process(int* data) {
if (!data) return;
*data *= 2;
}用引用代替指针
如果空值永远没有意义,请使用引用参数。编译器会保证该引用绑定到某个对象。
// Before
void f(Widget* w); // can be null?
// After
void f(Widget& w); // must be a real widget使用 std::optional 表示可选值
C++17 增加了 std::optional<T>,用于表达“可能有一个值”的语义;在不涉及分配的场景中,它比可为空的指针更清晰。
#include <optional>
std::optional<int> find(int x);
if (auto v = find(42)) std::cout << *v;智能指针与空值
std::unique_ptr 和 std::shared_ptr 也可以为空。它们可以转换为 bool 以进行检查,并通过 = nullptr 重置。
陷阱:删除后悬空
执行 delete p 后,指针仍然保存着旧地址。请重置它:p = nullptr;。智能指针会自动完成此操作。
快速检查
在现代 C++ 中,应该使用哪个空指针字面量?
回顾
使用 nullptr 表示空指针值。始终初始化指针。在解引用之前进行检查;更好的做法是,在空值永远无效时使用引用,在需要可选值时使用 std::optional。
用 AI 导师学习 C++ — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 51
- 课程
- 203
常见问题解答
「nullptr 与空指针安全」课时是免费的吗?
是的 — 「nullptr 与空指针安全」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「nullptr 与空指针安全」这节课中我会学到什么?
使用 nullptr 代替 NULL 或 0,并防止对空指针解引用 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「nullptr 与空指针安全」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 原始指针与取地址运算符
- 解引用与指针运算
- nullptr 与空指针安全
- 何时使用指针而非引用