内存回收函数不可抛出异常
7.9 ID_throwInDelete
内存回收函数抛出异常会导致标准未定义的行为。
抛出异常后,从 throw 表达式到相应 catch 子句各层调用栈中的对象会被自动析构,并释放内存空间,如果在这个过程中抛出异常便违反了异常处理机制,导致未定义的行为。
示例:
void operator delete(void* p) {
if (check_invalid(p)) {
throw Exception(); // Non-compliant, undefined behavior
}
deallocate(p);
}
例中 operator delete 通过自定义内存管理方法拒绝非法地址,但不应抛出异常,应直接终止程序的执行。
相关
依据
ISO/IEC 14882:2003 15.2(3)
ISO/IEC 14882:2011 3.7.4.2(3)-undefined
ISO/IEC 14882:2011 15.2(3)