如何检测 C++ 中未分配内存的双重删除或删除?
我正在编写全局删除/新运算符的调试版本,以检测内存泄漏、双重删除和未分配内存上的删除。
就“新”运算符而言,我覆盖了全局新运算符,并使用宏传递了文件名和行号信息。重写的“new”运算符将内存地址、文件名、大小和行号信息存储在以地址为键的映射中。
我也覆盖了“删除”运算符,这会从地图中删除已删除的地址条目。现在我想将删除的内存信息存储在另一个映射中,该映射存储调用“删除”的文件名和行号信息。
但删除运算符只接受参数(要删除的对象的内存地址)。 有人能告诉我如何检测代码中的双重删除吗?
I'm writing a debug versions of global delete/new operator to detect memory leaks, double deletes and delete on unallocated memory.
As far as "new" operator is concerned, I overrode the global new operator and using macros I passed file name and line number information. The overridden "new" operator stores the memory address, file name, size and line number information in map keyed on address.
I overrode "delete" operator too, which removes the deleted address' entry from the map. Now i want to store the deleted memory information in another map which stores the file name and line number information from where the "delete" was called.
But the delete operator takes only argument (memory address of the object to be deleted).
Can someone tell how to detect double deletes in the code?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(3)
有两个单独的问题:检测双重删除(而不是
删除从未分配的内存,并确定在哪里
它发生的程序。
首先,我的调试 operator new
在之前分配了保护区
在块返回之后(也用于检测超过该块的写入)
结束分配);我在 operator 中将它们设置为不同的模式
,并检查此模式。总有这样的机会
删除
从未分配的内存可能包含此模式,但机会是
非常非常小。
确定代码中发生错误的位置更加困难。
我已经编写了执行堆栈回溯的代码,但它非常系统
依赖。 (我有 Sparc 上的 Solaris、Intel 上的 Linux 以及
Windows。)它报告的只是十六进制的返回地址;这取决于
程序员使用其他工具来分析这些。 GNU binutils
软件包中有一个程序addr2line
,它在Linux下运行良好,但是
给定一个排序的地图,手动完成并不困难。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
您已经在重载的
new
中创建了分配的内存地址(键)和文件名、行号(值字段)的映射。在重载删除时,只需检查所传递的地址是否存在于您创建的地图中。
如果是,您认为对
delete
的调用有效,并从地图中删除该地址条目。如果否,则将删除调用视为错误,
在未通过 new 分配的指针上调用删除
或尝试多次调用删除
。You are already creating a map of allocated memory addresses(key) and filename, line number(value fields) inside your overloaded
new
.While in your overloaded delete just check if the address being passed exists in the map you created.
If Yes, You consider the call to
delete
as valid and remove that address entry from your map.If No, then consider the call to delete as faulty,
delete called on a pointer not allocated through your new
ortrying to call delete multiple times
.