我的程序中有内存泄漏。我已经用对我自己的函数的调用替换了对malloc
(和new
)的所有调用,该函数跟踪已分配的内容。在程序结束时,我会比较开头分配的内容和最后分配的内容,以获取“泄漏”的所有内容列表。
最终目标是获取“泄漏”位置列表,并将它们放在一个数组中。每次分配一些东西时,都会根据“泄漏”地址列表进行检查,如果匹配,则会调用一个特殊函数,然后我可以设置一个断点(然后我可以确定哪些对象正在泄漏,适当地处理它们。)
问题是,每次程序运行时,地址的前几部分都会改变。例如,第一次,一个“泄漏”地址为0x10c10
,下一次可能是0x20c10
。最后几位数字始终相同,但前几位数字不是。
有没有办法可以只比较最后几位?我在想使用mod,但我无法想出任何有用的东西。这些是常规整数,而不是字符串或任何东西。
答案 0 :(得分:4)
您可以通过对其应用按位&
运算符来比较十六进制数的最后N位数,并使用一个掩码来表示您希望比较的位数。例如,要比较最后三个十六进制数字,请应用三个F
s的掩码,如下所示:
uintptr_t a = ...
uintptr_t b = ...
if ((a&0xFFF) == (b&0xFFF)) {
...
}
您还可以检查最后N位数字的XOR,如下所示:
if ((a^b)&0xFFF == 0) {
...
}
有了这个说法,你的整体方法可能是次优的,因为内存分析器,例如valgrind,可以让你检测内存泄漏而不会通过地址操作跳过箍。
如果由于某种原因,本地分析是唯一的方法,您可以使用special macros for retrieving source file locations,并将它们与泄漏位置的地址一起保存在哈希表中。这将让你回到负责分配的源代码中的位置,而不需要操作地址。