当前位置: 首页 > news >正文

【C++】空指针弃NULL用nullptr

空指针(null pointer)不指向任何对象,在试图使用一个指针之前代码可以首先检查它是否为空。声明空指针的3种方法:

int* p1 = NULL;
int* p2 = nullptr;
int* p3 = 0;

在C语言中常用NULL生成空指针,NULL是一个宏,定义如下:

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

可以看到,NULL表示0或无类型指针(void*)。在C++中,NULL优先解释为整型0而不是指针值。所以使用NULL时,可能会出现问题:

#include <iostream>using namespace std;void f(int)
{cout << "f(int)" << endl;
}void f(int*)
{cout << "f(int*)" << endl;
}int main()
{f(0);f(NULL);f((int*)NULL);/*输出结果:f(int)f(int)f(int*)*/return 0;
}

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。

C++11引入了新关键字nullptr,表示空指针。在新标准下,现在的C++程序最好使用nullptr,同时尽量避免使用NULL。

还有一种方法是用常量0初始化指针来生产空指针。但是,把int变量直接赋给指针是错误的操作,即使int变量的值恰好等于0也不行。

int zero = 0;
pi = zero;//错误:不能把int变量直接赋给指针

以下内容来自《C++ Primer(第5版)》2.3.2 指针

建议:初始化所有指针

使用未经初始化的指针是引发运行时错误的一大原因。

和其他变量一样,访问未经初始化的指针所引发的后果也是无法预计的。通常这一行为将造成程序崩溃,而且一旦崩溃,要想定位到出错位置将是特别棘手的问题。

在大多数编译器环境下,如果使用了未经初始化的指针,则该指针所占内存空间的当前内容将被看作一个地址值。访问该指针,相当于去访问一个本不存在的位置上的本不存在的对象。糟糕的是,如果指针所占内存空间中恰好有内容,而这些内容又被当作了某个地址,我们就很难分清它到底是合法的还是非法的了。

因此建议初始化所有的指针,并且在可能的情况下,尽量等定义了对象之后再定义指向它的指针。如果实在不清楚指针应该指向何处,就把它初始化为nullptr或者0,这样程序就能检测并知道它没有指向任何具体的对象了。

http://www.lryc.cn/news/41065.html

相关文章:

  • 【selenium学习】数据驱动测试
  • 嵌入式硬件电路设计的基本技巧
  • Spring MVC 图片的上传和下载
  • 远程工具神器之MobaXterm (小白必看)
  • VRIK+Unity XR Interaction Toolkit 实现VR上半身的追踪(附带VRM模型导入Unity方法和手腕扭曲的解决方法)
  • 【C++进阶】map的介绍和使用
  • 第十四届蓝桥杯三月真题刷题训练——第 15 天
  • HTML5是什么?怎么学习HTML5?
  • 个人算法题精简导航整理(精炼汇总,含知识点、模板题、题单)
  • Mac 和 Win,到底用哪个系统学编程?
  • 文心一言---中国版的“ChatGPT”狂飙的机会或许要出现了
  • 2023最全Python+Selenium环境搭建教程-你绝对想不到有这么简单!
  • JavaSe第10次笔记
  • 【C语言笔记】自定义类型全解
  • 文心一言硬刚ChatGPT。文心一言能否为百度止颓?中国版ChatGPT“狂飙”的机会在哪儿?
  • 【RabbitMQ笔记10】消息队列RabbitMQ之死信队列的介绍
  • Python04 数据序列-字符串
  • Redis限流接口防刷
  • Yarn 资源调度器
  • 通达信 34日上升三角形主图源码
  • CSDN周赛第37期题解(Python版)
  • 程序调试方法
  • 【Android入门到项目实战--2.3】—— 活动的四种启动模式(standard、singleTop、singleTask、singleInstance)
  • SpringCloud微服务技术栈.黑马跟学(三)
  • 学习Java——集合类
  • [前端笔记035]vue2之脚手架vue-cli
  • 《Linux的权限》
  • js类型转换
  • PostMan工具的使用
  • Sentinel 授权规则规则持久化