【发布时间】:2011-09-13 16:50:54
【问题描述】:
我正在编写全局删除/新操作符的调试版本,以检测内存泄漏、双重删除和未分配内存上的删除。
就“new”运算符而言,我覆盖了全局 new 运算符并使用宏传递了文件名和行号信息。重写的“new”操作符将内存地址、文件名、大小和行号信息存储在以地址为键的映射中。
我也覆盖了“删除”运算符,它从地图中删除了已删除地址的条目。现在我想将删除的内存信息存储在另一个映射中,该映射存储调用“删除”的文件名和行号信息。
但删除操作符只接受参数(要删除的对象的内存地址)。 有人可以告诉如何检测代码中的双重删除吗?
【问题讨论】:
-
我认为有这方面的工具。
-
为什么不能表现得像“new”一样,即删除时,检查传入的地址,如果它已经在“deleted”映射中,那就是双重删除。问题出在哪里?
-
您可能还需要考虑使用模式(如 0xbaadf00d)写入已分配/解除分配的内存,以查看是否访问了已解除分配或未初始化的内存。 Visual Studio 调试堆可以做到这一点,还有更多。见stackoverflow.com/questions/127386/…
-
@FredOverflow:感谢您将我指向那里,但即使在那里,程序也会检测到双重删除(甚至可能是未分配内存上的删除)。我很想知道在双重删除的内存上第一次删除是从哪里调用的。在大型代码库中,这是一个有用的信息。
标签: c++ memory memory-leaks new-operator delete-operator