如何在C ++中检测重复删除或未分配内存上的删除?

如何解决如何在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?