按报错关键字 + 本质原因 + 快速修复整理,区分编译期报错、运行期崩溃、警告类问题,兼顾日常刷题、Qt、嵌入式、项目开发场景。
一、编译期报错(编译不通过,IDE 标红)
| 报错关键字 | 问题本质 | 修复方案 |
|---|---|---|
'xxx': undeclared identifier |
标识符未定义:变量/函数名拼写错误、忘记头文件、作用域问题 | 1. 核对拼写;2. 补充 #include 头文件;3. 检查变量作用域(局部变量不能全局访问) |
redefinition; multiple initialization |
重复定义:头文件重复包含、全局变量重复定义 | 1. 头文件加保护宏 #ifndef / #define / #endif;2. 全局变量用 extern 声明,仅一处定义 |
cannot convert "类型A" to "类型B" |
类型不匹配,赋值/传参类型错误 | 强制类型转换,或修改变量定义的类型 |
expected ';' before identifier 'xxx' |
少写分号、括号不匹配、结构体末尾漏分号 | 检查上一行代码,补充分号/大括号/小括号 |
'xxx': function does not take N arguments |
函数调用参数个数不匹配 | 对照函数声明,补全/删减调用参数 |
LNK2019: unresolved external symbol |
链接错误:函数只有声明无实现、库未链接、名字改编冲突 | 1. 补全函数实现;2. 配置链接第三方库;3. C 代码在 C++ 中用 extern "C" 包裹 |
invalid type argument of unary '*' |
解引用空指针/非指针变量 | 确保 * 后面是合法指针,且指针已初始化 |
二、运行期崩溃(编译通过,运行闪退)
| 报错关键字 | 问题本质 | 修复方案 |
|---|---|---|
段错误 Segmentation fault (core dumped) |
非法内存访问:空指针解引用、数组越界、栈溢出 | 1. 加判断避免空指针访问;2. 严格控制数组下标;3. 大数组改用堆内存 new/malloc |
free(): double free detected |
重复释放同一块堆内存 | 释放后置空指针 ptr = nullptr,避免二次释放 |
heap corruption detected |
堆内存越界读写、new/delete 混用(new[] 配 delete) |
保证 new ↔ delete、new[] ↔ delete[] 配对 |
| 死循环卡死 | 循环条件永远成立,无退出条件 | 增加循环终止条件,或加计数器防止无限循环 |
| 栈溢出 Stack Overflow | 函数递归过深、局部超大数组 | 限制递归深度,大数组移到全局/堆内存 |
三、C++ 专属面向对象报错(类、继承、多态)
| 报错关键字 | 问题本质 | 修复方案 |
|---|---|---|
private member cannot be accessed |
访问私有成员,无权限 | 改用公有成员函数访问,或调整访问权限 |
no appropriate default constructor available |
无默认构造函数,成员变量/父类无无参构造 | 1. 手动写无参构造;2. 初始化列表调用带参构造 |
pure virtual function not overridden |
纯虚函数未实现,抽象类被实例化 | 子类必须重写所有父类纯虚函数 |
base class is inaccessible |
继承权限问题(默认私有继承) | 明确继承权限 public |
use of deleted function |
拷贝构造/赋值运算符被禁用(=delete),或移动语义冲突 |
避免拷贝对象,改用引用/指针传递 |
四、指针与内存经典坑(C/C++ 重灾区)
| 报错现象 | 问题本质 | 修复方案 |
|---|---|---|
| 野指针 | 指针指向已释放的内存、未初始化的随机地址 | 指针定义即置空,释放后立即置空 |
| 内存泄漏 | new/malloc 申请内存后未释放 |
配对使用 delete/free,C++ 优先用智能指针 unique_ptr/shared_ptr |
| 悬垂引用 | 引用绑定局部变量,函数结束后变量销毁 | 禁止返回局部变量的引用,改用返回值/堆内存 |
五、万能排查流程(C/C++ 通用)
1. 编译报错 :优先看第一行报错 ,编译器会把最早出现的错误放在最前面,解决第一个后大量连锁报错会自动消失;
2. 运行崩溃 :用调试模式(Debug)打断点,定位崩溃代码行,重点排查指针、数组、递归、内存释放 ;
3. 链接报错 LNK2019 :90% 是只有声明没有实现 ,其次是第三方库没配置链接;
4. 头文件报错 :一律加头文件保护宏,杜绝重复包含。
六、补充:头文件保护宏(必背模板)
cpp
#ifndef HEADER_NAME_H
#define HEADER_NAME_H
// 头文件内容
#endif