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

深圳开发公司的小程序/新网站百度seo如何做

深圳开发公司的小程序,新网站百度seo如何做,网络系统工程师,网站建设投标ppt模板C11 nullptr:初始化空指针 实际开发中,避免产生“野指针”最有效的方法,就是在定义指针的同时完成初始化操作,即便该指针的指向尚未明确,也要将其初始化为空指针。 所谓“野指针”,又称“悬挂指针”&…

C++11 nullptr:初始化空指针

实际开发中,避免产生“野指针”最有效的方法,就是在定义指针的同时完成初始化操作,即便该指针的指向尚未明确,也要将其初始化为空指针。

所谓“野指针”,又称“悬挂指针”,指的是没有明确指向的指针。野指针往往指向的是那些不可用的内存区域,这就意味着像操作普通指针那样使用野指针(例如 &p),极可能导致程序发生异常。

C++98/03 标准中,将一个指针初始化为空指针的方式有 2 种:

int *p = 0;
int *p = NULL; //推荐使用

可以看到,我们可以将指针明确指向 0(0x0000 0000)这个内存空间。一方面,明确指针的指向可以避免其成为野指针;另一方面,大多数操作系统都不允许用户对地址为 0 的内存空间执行写操作,若用户在程序中尝试修改其内容,则程序运行会直接报错。

相比第一种方式,我们更习惯将指针初始化为 NULL。值得一提的是,NULL 并不是 C++ 的关键字,它是 C++ 为我们事先定义好的一个宏,并且它的值往往就是字面量 0(#define NULL 0)。

C++ 中将 NULL 定义为字面常量 0,虽然能满足大部分场景的需要,但个别情况下,它会导致程序的运行和我们的预期不符。例如:

#include <iostream>
using namespace std;
void isnull(void *c){cout << "void*c" << endl;
}
void isnull(int n){cout << "int n" << endl;
}
int main() {isnull(0);isnull(NULL);return 0;
}

程序执行结果为:

int n
int n

对于 isnull(0) 来说,显然它真正调用的是参数为整形的 isnull() 函数;而对于 isnull(NULL),我们期望它实际调用的是参数为 void*c 的 isnull() 函数,但观察程序的执行结果不难看出,并不符合我们的预期。

C++ 98/03 标准中,如果我们想令 isnull(NULL) 实际调用的是 isnull(void* c),就需要对 NULL(或者 0)进行强制类型转换:

isnull( (void*)NULL );
isnull( (void*)0 );

如此,才会成功调用我们预期的函数(读者可自行执行此代码,观察输出结果)。

由于 C++ 98 标准使用期间,NULL 已经得到了广泛的应用,出于兼容性的考虑,C++11 标准并没有对 NULL 的宏定义做任何修改。为了修正 C++ 存在的这一 BUG,C++ 标准委员会最终决定另其炉灶,在 C++11 标准中引入一个新关键字,即 nullptr。

在使用 nullptr 之前,读者需保证自己使用的编译器支持该关键字。以 Visual Studio 和 codeblocks 为例,前者早在 2010 版本就对 C++ 11 标准中的部分特性提供了支持,其中就包括 nullptr;如果使用后者,读者需将其 G++ 编译器版本至少升级至 4.6.1(同时开启 -std=c++0x 编译选项)。

nullptr 是 nullptr_t 类型的右值常量,专用于初始化空类型指针。nullptr_t 是 C++11 新增加的数据类型,可称为“指针空值类型”。也就是说,nullpter 仅是该类型的一个实例对象(已经定义好,可以直接使用),如果需要我们完全定义出多个同 nullptr 完全一样的实例对象。

值得一提的是,nullptr 可以被隐式转换成任意的指针类型。举个例子:

int * a1 = nullptr;
char * a2 = nullptr;
double * a3 = nullptr;

显然,不同类型的指针变量都可以使用 nullptr 来初始化,编译器分别将 nullptr 隐式转换成 int*、char* 以及 double* 指针类型。

另外,通过将指针初始化为 nullptr,可以很好地解决 NULL 遗留的问题,比如:

#include <iostream>
using namespace std;
void isnull(void *c){cout << "void*c" << endl;
}
void isnull(int n){cout << "int n" << endl;
}
int main() {isnull(NULL);isnull(nullptr);return 0;
}

程序执行结果为:

int n
void*c

借助执行结果不难看出,由于 nullptr 无法隐式转换为整形,而可以隐式匹配指针类型,因此执行结果和我们的预期相符。

总之在 C++11 标准下,相比 NULL 和 0,使用 nullptr 初始化空指针可以令我们编写的程序更加健壮。

http://www.lbrq.cn/news/824365.html

相关文章:

  • 重庆网站建设电话/seo优化推广公司
  • wordpress站点推荐/百度资源搜索引擎
  • 电商的网站怎么做的好/seo推广效果怎么样
  • wordpress价格表单/网站优化公司认准乐云seo
  • 做网站成为首富的外国人/seo优化的主要内容
  • 昌平网站开发公司电话/网络营销可以做什么工作
  • 想要网站推广页面/seo教程论坛
  • 轻量应用服务器做网站/seo排名软件价格
  • 网站设计就业前景如何/公司做网络推广怎么做
  • wordpress清空演示数据/seo公司软件
  • 泉州高端网站建设/备案域名
  • 供应链金融网站开发/百度查一下
  • 政府网站什么时候建设的/浏览广告赚佣金的app
  • 河南建筑信息一体化平台/哈尔滨seo优化软件
  • html5炫酷的网站/优化推广方案
  • 做微商网站需要哪些/seo站长网
  • 龙岗网站设计资讯/seo是啥
  • 网站开发技术岗位职责/app营销推广方案
  • 展厅设计公司网站/seo兼职接单平台
  • 给你一个网站怎么做的吗/网络营销策划书格式
  • 私密浏览器免费看片在线看/信息流优化师没经验可以做吗
  • 健网站怎么做/网络营销建议
  • 网站快速开发平台/百度指数1000搜索量有多少
  • 网站做系统叫什么软件/seo自动发布外链工具
  • 官网网站备案流程/网页制作免费模板
  • 山东华泰建设集团有限公司官方网站/线下推广方式有哪些
  • 海南综合网站/搜外友链平台
  • 如何建设一个公司网站/佛山网站建设技术托管
  • 西宁知名网站制作公司/台湾新闻最新消息今天
  • 新乡网站建设设计/百度网游排行榜
  • 用 STM32 的 SYSTICK 定时器与端口复用重映射玩转嵌入式开发
  • kafka 日志索引 AbstractIndex
  • 零基础学习性能测试第三章:执行性能测试
  • 医学图像超分辨率重建深度学习模型开发报告
  • MyBatis Plus高效开发指南
  • 张量交换维度(转置),其实是交换了元素的排列顺序