用 nullptr 初始化指针最安全,c++11 起推荐使用,类型安全且语义清晰;局部指针不自动初始化,需显式设为 nullptr;智能指针如 std::unique_ptr 更能避免资源管理漏洞。

用 nullptr 初始化指针最安全
现代 C++(C++11 起)推荐用 nullptr 初始化空指针,它类型安全、语义清晰,且不会被误认为整数。过去用 0 或 NULL 容易引发函数重载歧义或隐式转换问题。
-
int* p = nullptr;—— 明确表示“这是空指针”,编译器能做类型检查 -
int* p = 0;—— 在重载场景下可能调用void func(int)而非void func(int*) -
#define NULL 0(传统宏)本质仍是整数,不具指针类型,nullptr是关键字,类型为std::nullptr_t
成员指针初始化要写在构造函数初始化列表里
类内指针成员不能只在构造函数体中赋值(那是赋值,不是初始化),否则可能访问未初始化的野指针。必须在初始化列表中显式设为 nullptr。
class Widget {
int* data;
public:
Widget() : data(nullptr) {} // ✅ 正确:初始化列表
// Widget() { data = nullptr; } // ❌ 危险:data 先被默认初始化为随机值,再赋值
};
全局/静态指针自动初始化为 nullptr,但局部指针不会
全局、静态或 thread_local 指针变量会被零初始化(即等价于 nullptr),但栈上局部指针变量**不初始化**,内容是未定义的垃圾值。
-
static int* p;→ 自动为nullptr -
int* p;(函数内)→ 值不确定,使用前必须手动设为nullptr或有效地址 - 忘记初始化局部指针是常见段错误源头,尤其在条件分支后使用时
用 std::unique_ptr 替代裸指针能避免空指针管理漏洞
如果目标是“拥有并管理一个对象”,裸指针加 nullptr 初始化只是起点;真正容易出错的是后续的 new/delete 配对、异常安全、拷贝语义等问题。这时直接用智能指针更可靠。
-
std::unique_ptr<int> p;</int>—— 默认构造即为空(等价于nullptr),无需手动初始化 -
p.reset(new int(42));或p = std::make_unique<int>(42);</int>—— 自动管理生命周期 - 函数返回
std::unique_ptr不会意外复制,也不会忘记释放
裸指针配 nullptr 是基础,但真正在意资源安全时,该跳过这层手动控制。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











