首页 > 解决方案 > 删除无效地址时 C++ 抛出异常

问题描述

我正在制作一个自定义分配器,我知道应用程序何时尝试释放无效地址,但我不知道应该抛出什么异常。例如:

...
int *a=new int;
delete a;
delete a;
...

当第二次删除发生时,我知道我的内存池中没有分配该地址,我需要抛出异常让用户知道在程序中的某个时刻他试图解除分配无效地址。

标签: c++exception

解决方案


不允许operator delete抛出任何异常。抛出异常operator delete会导致未定义的行为。见[basic.stc.dynamic.deallocation]/3

即使您可以通过这种方式诊断双重删除,使用delete a;两次仍然会导致未定义的行为。这是不可避免的,例如因为delete a;也首先调用析构函数,并且通常不允许在对象上调用析构函数两次。

即便如此,operator delete在不干预分配的情况下对同一个指针调用两次仍然会导致未定义的行为,因为第一次operator delete调用结束了分配内存的存储持续时间,使指针值无效,并且将无效指针值传递给任何释放函数会导致未定义行为,请参阅[basic.stc]/4

当用户试图双重删除指针时,您唯一能做的就是中止程序,例如通过调用std::abort. 这可能是最好的做法,因为未定义的行为已经发生,因此继续执行该程序将毫无意义,甚至存在安全风险。


推荐阅读