我的程序中有内存泄漏。我已经将对malloc (和new)的所有调用替换为对自己函数的调用,该函数跟踪分配的内容。在程序的末尾,我比较了最初分配的东西和最后分配的东西,得到了所有“泄漏”的列表。
最终目标是获取“泄漏”位置的列表,并将它们放在一个数组中。每次分配某个内容时,都会根据“泄漏”地址列表进行检查,如果有匹配,则调用一个特殊函数,然后我可以在该函数上设置一个断点(然后我可以确定哪些对象泄漏,并对其进行适当处理)。
问题是,每次程序运行时,地址的前几个部分都会发生变化。例如,第一次“泄漏”地址将是0x10c10,下一次可能是0x20c10。最后几个数字总是相同的,但前几个数字不是。
有办法只比较最后几位数字吗?我在考虑使用国防部,但我没能想出任何可行的办法。这些是规则整数,而不是字符串或任何东西。
发布于 2016-10-21 14:48:13
您可以通过应用按位&运算符对十六进制数的最后N位数进行比较,并使用表示希望比较的数字数的掩码。例如,要比较最后三个十六进制数字,请应用三个Fs的掩码,如下所示:
uintptr_t a = ...
uintptr_t b = ...
if ((a&0xFFF) == (b&0xFFF)) {
...
}您还可以检查最后N位数中的零数字的XOR值,如下所示:
if ((a^b)&0xFFF == 0) {
...
}尽管如此,您的总体方法可能不是最优的,因为内存分析器(如缬磨 )允许您检测内存泄漏,而无需跳过地址操作的循环。
如果出于某种原因,土生土长的分析是唯一的方法,那么您可以使用用于检索源文件位置的特殊宏,并将它们保存在哈希表中以及泄漏位置的地址中。这将让您回到源代码中负责分配的位置,而根本不需要操作地址。
https://stackoverflow.com/questions/40179597
复制相似问题