如何解决如何在C ++中检测重复删除或未分配内存上的删除?
| 我正在编写全局删除/新运算符的调试版本,以检测内存泄漏,重复删除和删除未分配的内存。 就“ new”运算符而言,我覆盖了全局new运算符,并使用宏传递了文件名和行号信息。重写的“ new”运算符将存储地址,文件名,大小和行号信息存储在按地址键入的映射中。 我也覆盖了“ delete”运算符,该运算符从地图中删除了已删除的地址条目。现在,我想将删除的内存信息存储在另一个映射中,该映射存储从中调用“删除”的文件名和行号信息。 但是delete运算符仅采用参数(要删除的对象的内存地址)。 有人可以告诉我如何检测代码中的双重删除吗?解决方法
您已经在重载的“ 0”内部创建了分配的内存地址(键)和文件名,行号(值字段)的映射。
在超载删除中,只需检查所创建的映射中是否存在要传递的地址。
如果是,则您认为对“ 1”的呼叫有效,并将该地址条目从地图中删除。
如果否,则将删除呼叫视为错误的“ 2”或“ 3”。
, 如果您需要区分重复删除与从未分配的内存删除,则只需将地址映射到已分配内存的状态即可,而不是从映射中删除元素,只需更新状态以将其标记为已释放即可。每个删除操作中的测试将验证该地址是否存在(如果不是,则错误是删除一个从未分配的地址),如果存在,则检查是否已经释放了内存(如果存在,则错误是双精度释放)。
, 有两个单独的问题:检测双重删除(相对于
删除从未分配的内存,并确定其中的位置
它发生的程序。
首先,我的调试
operator new
在分配保护区之前
并在该块之后返回(也用于检测超过
在解除分配上结束);我在operator
delete
中将它们设置为其他模式,然后检查该模式。总是有机会
从未分配的内存可能包含此模式,但是机会是
非常非常小
确定代码中错误发生的位置更加困难。
我已经编写了执行堆栈回调的代码,但这是非常系统的
依赖。 (我有Sparc上的Solaris版本,Intel上的Linux版本以及
Windows。)它所报告的全部是十六进制的返回地址。要看
程序员使用其他工具进行分析。 GNU binutils
程序包中有一个程序addr2line
,该程序在Linux下可以正常运行,但是
给定已排序的地图,手动操作并不难。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。