assert 仅在 NDEBUG 未定义时生效,Debug 模式有效、Release 模式被预处理器完全移除;不可用于关键校验、有副作用表达式或用户输入检查,应改用 if + throw/abort。
assert 在 C++ 里什么时候会真正起作用
assert 只在 NDEBUG 宏未定义时生效,也就是说,默认 Debug 模式下有效,Release 模式下整行被编译器直接剔除——不是“不执行”,而是“根本不存在”。如果你在 Release 版本里发现 assert 没触发,别怀疑写法,先检查是否链接了 -DNDEBUG 或项目配置里启用了 NDEBUG。
常见误操作:
- 把关键校验逻辑(比如指针非空、数组下标合法)全压给
assert,结果上线后崩溃找不到原因 - 在头文件里无条件写
assert(ptr != nullptr),导致第三方库或 Release 构建时出现未定义行为 - 用
assert检查有副作用的表达式,例如assert(x++ > 0)—— Debug 能跑,Release 里x就不自增了
替代方案:什么时候该用 assert,什么时候该用 if + throw / abort
判断依据很简单:这个条件「违反时程序是否还能继续安全运行」。
assert 仅适用于「绝不该发生、发生了说明代码逻辑有严重缺陷」的场景,比如:
立即学习“C++免费学习笔记(深入)”;
- 函数内部某个中间计算结果理应恒为正,却得到负值
-
switch 分支覆盖了所有枚举值,但 default 里还写了
assert(false) - 递归终止条件被绕过,深度爆栈前做兜底提示
而以下情况不该用 assert: