C++中未定义行为导致的程序崩溃解决方案
在C++开发中,“未定义行为”(Undefined Behavior, UB)是导致程序崩溃、数据损坏等问题的头号敌人。本文基于CSDN技术社区的实战经验,系统梳理UB的常见类型、调试方法和防御策略,提供可直接复用的代码模板和案例分析。
一、未定义行为的主要类型与诊断
1. 数组越界访问
典型场景:
- 使用
std::vector
时at()
未检查索引 - 原生数组通过
*(ptr + offset)
访问越界
崩溃示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {
1, 2, 3};
// 未定义行为:访问vec[3](有效索引为0-2)
std::cout << "危险访问: " << vec[3] << std::endl; // 可能崩溃或输出垃圾值
return 0;
}
调试技巧:
- 使用
at()
替代operator[]
:try { std::cout << "安全访问: " << vec.at(3) << std::endl; // 抛出std::out_of_range } catch (const std::out_of_range& e) { std::cerr << "捕获异常: " << e.what() << std::endl; }
2. 空指针解引用
典型场景:
- 未初始化的指针直接使用
new
分配失败后未检查返回值
崩溃示例:
#include <iostream>
int main() {
int* ptr