c++ - 删除无效地址时 C++ 抛出异常
问题描述
我正在制作一个自定义分配器,我知道应用程序何时尝试释放无效地址,但我不知道应该抛出什么异常。例如:
...
int *a=new int;
delete a;
delete a;
...
当第二次删除发生时,我知道我的内存池中没有分配该地址,我需要抛出异常让用户知道在程序中的某个时刻他试图解除分配无效地址。
解决方案
不允许operator delete
抛出任何异常。抛出异常operator delete
会导致未定义的行为。见[basic.stc.dynamic.deallocation]/3。
即使您可以通过这种方式诊断双重删除,使用delete a;
两次仍然会导致未定义的行为。这是不可避免的,例如因为delete a;
也首先调用析构函数,并且通常不允许在对象上调用析构函数两次。
即便如此,operator delete
在不干预分配的情况下对同一个指针调用两次仍然会导致未定义的行为,因为第一次operator delete
调用结束了分配内存的存储持续时间,使指针值无效,并且将无效指针值传递给任何释放函数会导致未定义行为,请参阅[basic.stc]/4。
当用户试图双重删除指针时,您唯一能做的就是中止程序,例如通过调用std::abort
. 这可能是最好的做法,因为未定义的行为已经发生,因此继续执行该程序将毫无意义,甚至存在安全风险。
推荐阅读
- xml - 当我在布局上放置背景时,我的应用程序无法运行并出现错误
- php - 通过两个自定义字段过滤自定义帖子类型
- javascript - 如何找出节点进程中的内存泄漏
- javascript - Vuejs关于选择更改组件属性
- javascript - Javascript:无法识别对象属性
- php - 无法从 MySQL 数据库中删除条目 - PHP
- python - 向 stem 发送信号会关闭套接字
- javascript - 改进 wordpress 中脚本/样式的顺序
- javascript - Qualtrics 中下拉菜单的 jQuery/Javascript 默认选项
- python - 如何读取 .array 文件并将数字传输到 Python 中的空列表中