全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++未定义行为(undefined behavior)

衡量一个人是否真正活着的根本方法,就是看他是否有意愿、有能力做出主动的选择。

在计算机程序设计中,未定义行为(undefined behavior)是指行为不可预测的计算机代码。这是一些编程语言的一个特点,最有名的是在C语言中。在这些语言中,为了简化标准,并给予实现一定的灵活性,标准特别地规定某些操作的结果是未定义的,这意味着程序员不能预测会发生什么事。

一个问题

此问题摘自知乎:

对顺序容器 ( vector ) 的访问:

如果使用 operator[] 访问容器,下标越界是未定义行为。
使用 at 访问,下标越界,则抛出一个 out_of_range 异常。
下标越界应该是明显错误的,但是为什么 C++ 标准选择把 operator[] 列为未定义行为,而加入at成员在对成员访问时进行下标检查?

同样摘取一些回答

回答一:

C++ 的设计理念之一,就是你不需要为你不使用的特性付出代价。如果你能确保你的下标不越界,C++就不会进行检查。

回答二:

检查就表示有运算判断的开销,C++将效率放在第一位,假设用户之前已经对[]访问的下标做过检查了,在一个大量访问的for循环中,但是vector还是自作聪明的每次都判断一次下标越界,这个效率影响你可想而知!你会不会在这个情况下骂它管的太多呢。所以说将所有的权利都交给你,vector不做太多自作聪明的处理。

什么是未定义

未定义行为(Undefined Behavior)是指语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义的行为,可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么都没有发生。

下文会罗列C++中的一系列未定义结果和未定义行为,持续整理更新。

未定义的结果

1、当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的。

signed char c2 = 256; // c2的值是未定义的

2、函数体之内定义的变量:未初始化(uninitialized),其值undefined。

3、算术表达式有可能产生未定义的结果

数学性质本身:除数为0
计算机的特点:溢出;很多系统在编译和运行时都不报出溢出错误,像其他未定义的行为一样,溢出的结果是不可预知的。

未定义的行为

未定义行为,无法预估Runtime会发生什么(unpredictable:normal、crashing、incorrect results)。

1、解引用空指针、非法迭代器或者尾后迭代器都是未定义行为

2、访问一个无效数组索引,下标越界

3、当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果是未定义的。

实际执行时通常发生的是对象的derived成员没有被销毁。
4、在两个异常同时存在的情况下,程序若不是结束执行就是导致未定义行为。

5、释放一个非new分配的内存,或者将相同的指针值释放多次,其行为是未定义的。

6、string s(s2,pos2); // s是string s2从下标pos2开始的字符拷贝,如果pos2>s2.size(),构造函数的行为未定义

7、试图比较两个无关地址是未定义行为

8、对于那些没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为。

int i=0;
cout<<i<<" "<<++i<<endl; // 未定义
// 编译器可能先求++i的值,再求i的值;也可能先求i的值,再求++i的值。注意与print函数的区别。
*beg=toupper(*beg++); // 未定义

9、对有符号数进行左移操作可能会改变符号位的值,因此是一种未定义的行为。移位运算符右侧的运算对象一定不能为负,而且值必须严格小于结果的位数,否则就会产生未定义的行为。

10、使用static_cast将void*转换成其他类型指针,必须确保转换后所得的类型就是指针所指的类型。类型一旦不符,将产生未定义行为。

double d;
void* p=&d;
double *dp=static_cast<double*>(p);

11、const_cast只能改变运算对象的底层const,如果对象本身是一个常量,使用const_cast执行写操作就会产生未定义行为。

12、不要使用get初始化另一个智能指针或为智能指针赋值,否则将会产生两个独立的shared_ptr指向相同的内存,这将产生未定义行为。

13、delete []p;如果忘记[],其行为是未定义的。 删除单一对象的指针加[],其行为也是未定义的。


# c  # 未定义行为  # c语言未定义行为  # undefined  # behavior  # 就会  # 是在  # 太多  # 结果是  # 将会  # 是指  # 自作聪明  # 的是  # 都是  # 运算符  # 是一个  # 这是  # 情况下  # 迭代  # 是一种  # 带着  # 都不  # 在这个  # 有可能  # 你会 


相关文章: css网站制作参考文献有哪些,易聊怎么注册?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站主机类型有哪些?如何正确选型  北京建设网站制作公司,北京古代建筑博物馆预约官网?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  名字制作网站免费,所有小说网站的名字?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  已有域名如何快速搭建专属网站?  宁波自助建站系统如何快速打造专业企业网站?  如何在Windows服务器上快速搭建网站?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  javascript基本数据类型及类型检测常用方法小结  建站主机功能解析:服务器选择与快速搭建指南  深圳网站制作案例,网页的相关名词有哪些?  开封网站制作公司,网络用语开封是什么意思?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何在景安云服务器上绑定域名并配置虚拟主机?  相册网站制作软件,图片上的网址怎么复制?  高端企业智能建站程序:SEO优化与响应式模板定制开发  招商网站制作流程,网站招商广告语?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何快速启动建站代理加盟业务?  简单实现Android验证码  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站主机CVM配置优化、SEO策略与性能提升指南  盘锦网站制作公司,盘锦大洼有多少5G网站?  如何在IIS7中新建站点?详细步骤解析  高防服务器:AI智能防御DDoS攻击与数据安全保障  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  网站制作新手教程,新手建设一个网站需要注意些什么?  建站主机与虚拟主机有何区别?如何选择最优方案?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  怎么将XML数据可视化 D3.js加载XML  创业网站制作流程,创业网站可靠吗?  如何用腾讯建站主机快速创建免费网站?  定制建站价位费用解析与套餐推荐全攻略  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  定制建站如何定义?其核心优势是什么?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Python文件管理规范_工程实践说明【指导】  如何高效搭建专业期货交易平台网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  简单实现Android文件上传  建站之星备案是否影响网站上线时间?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  焦点电影公司作品,电影焦点结局是什么?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何用免费手机建站系统零基础打造专业网站?  如何构建满足综合性能需求的优质建站方案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。