指针指向null_C++空指针使用nullptr代替NULL

C/C++中,为了避免野指针(即指针没有指向任何地址)的出现,声明一个指针后,最好马上对其进行初始化。

如果暂时不明确指针指向哪个变量,则可以赋予NULL,如:

int

除了NULL之外,C++11新标准引入了nullptr来表示一个空指针。

nullptr 既不是整型类型,也不是指针类型,nullptr 的类型是 std::nullptr_t,能转换成任意的指针类型。

为什么建议使用nullptr代替NULL呢?

这是因为在C++中,NULL是被定义为0的常量,当遇到函数重载时,就会出现问题。

比如有下面两个函数时:

  • void foo(int n)
  • void foo(char* s)

函数重载:C++允许在同一作用域中声明多个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同。

#include 

编译上述代码,结果如下图所示,编译器提示有两个函数都可能匹配,产生二义性。

6bc779e0e40770614cf7dca5e98043c7.png


而用nullptr,编译器则会选择 foo(char* s)的函数,因为nullptr不是整数类型。

#include 

运行结果如下图所示:

5d810517825285286808dd52377b3af4.png

因此,当想使用空指针时,优先使用nullptr,而非NULL。

### C++指针指向 `NULL` 与指针释放的区别 在 C++ 编程中,处理动态分配内存时经常遇到两个概念:将指针设置为 `nullptr` 和释放指针指向的内存。这两个操作虽然都涉及指针管理,但在语义和技术实现上有显著差异。 #### 将指针设为 `nullptr` 当一个指针被赋值为 `nullptr` 或者旧标准中的 `(void*)0` 或宏定义 `NULL` 时,这仅仅表示该指针当前不指向任何有效的对象或内存位置[^1]。这种做法通常用于标记某个时刻之后不再使用的资源,防止悬空指针(dangling pointer),即试图访问已经被删除的对象的情况发生。 ```cpp int* p = nullptr; if (p != nullptr) { // 安全检查逻辑... } ``` #### 指针释放 (`delete`) 另一方面,调用 `delete` 运算符会真正回收由 `new` 分配出来的堆上空间,并执行析构函数(如果有的话)。这意味着不仅清除了实际的数据存储区域,还可能触发额外的动作来清理关联状态。一旦完成此过程,则不能再通过原来的指针访问这块已被释放掉的空间;否则可能导致未定义行为。 ```cpp int* q = new int(42); // 使用q... delete q; // 此处应确保只做一次销毁动作 q = nullptr; // 防止后续误用已释放的指针 ``` 需要注意的是,在现代 C++ 实践里推荐使用智能指针如 `std::unique_ptr`, `std::shared_ptr` 来自动管理生命周期复杂的对象实例,从而减少手动管理和潜在错误的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值