0

0

C++中的未定义行为(Undefined Behavior)有哪些?(常见陷阱)

php中文网

php中文网

发布时间:2026-01-12 11:55:02

|

996人浏览过

|

来源于php中文网

原创

未定义行为(UB)指标准完全不约束后果,编译器可任意优化、崩溃或静默出错;典型场景包括数组/指针越界、空指针或悬垂指针解引用、二次释放、有符号整数溢出等。

c++中的未定义行为(undefined behavior)有哪些?(常见陷阱)

未定义行为(UB)不是“随机出错”,而是标准完全不管后果——编译器可以优化掉、生成任意代码、崩溃、静默出错,甚至看似正常运行。它不报错、不警告(除非你开了严格检查),但一旦触发,程序逻辑就不可信。

访问越界的数组或指针

数组下标超出声明范围,或指针算术越过对象边界,都是典型 UB。哪怕只是读取(比如 a[5] 访问长度为 5 的数组),也不行。

  • int a[5] = {}; a[5] = 0; —— 写越界,UB
  • int* p = &a[0]; *(p + 5); —— 读越界,UB(即使没解引用,p + 5 本身已越界)
  • std::vector v(3); v.data()[5]; —— 同样 UB,data() 不改变边界语义

解引用空指针或悬垂指针

空指针解引用是教科书级 UB;悬垂指针(指向已销毁对象的指针)解引用也一样危险,哪怕对象内存还没被覆盖。

  • int* p = nullptr; *p = 1; —— UB,哪怕某些平台“恰好”不崩溃
  • int* q; { int x = 42; q = &x; } *q; —— x 生命周期结束,q 成悬垂指针,解引用即 UB
  • delete p; delete p;delete[] p; 混用 delete p; —— 二次释放或类型不匹配,UB

有符号整数溢出

C++ 标准只对无符号整数定义了模运算(自动回绕),而有符号溢出(如 int max + 1)是 UB —— 编译器可能据此做激进优化。

火山方舟
火山方舟

火山引擎一站式大模型服务平台,已接入满血版DeepSeek

下载

立即学习C++免费学习笔记(深入)”;

  • int x = INT_MAX; x++; —— UB,不是“变成 INT_MIN”
  • for (int i = 0; i 当 n == INT_MAX 时,i++ 必然溢出,UB
  • unsigned int 替代可规避(前提是业务允许回绕);否则应显式检查边界

未初始化的局部变量读取

非 static、非类成员的内置类型(int, double, 指针等)若未显式初始化,其值是“不确定的”,首次读取即 UB。

  • int x; return x * 2; —— UB,哪怕 x 碰巧是 0
  • int arr[3]; return arr[0]; —— 同样 UB(arr 是栈上未初始化数组)
  • 例外:static 或全局变量会零初始化;类成员若在构造函数中未显式初始化,也属 UB(除非是 POD 类型且定义了默认构造)

基本上就这些 —— 不复杂但容易忽略。开编译器警告(-Wall -Wextra -Wuninitialized)、用 AddressSanitizer 和 UBSan 运行时检测,比靠经验更可靠。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

534

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

51

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

194

2025.08.29

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.12.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

4430

2023.07.31

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

3

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.4万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 11.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号