我的程序中存在内存泄漏。我已将所有对 malloc
(和 new
)的调用替换为对我自己的函数的调用,该函数跟踪分配的内容。在程序结束时,我比较开始时分配的内容和最后分配的内容,以获得“泄漏”的所有内容的列表。
最终目标是获取“泄漏”位置的列表,并将它们放入一个数组中。每次分配某些内容时,都会根据“泄漏”地址列表进行检查,如果存在匹配,它会调用一个特殊函数,然后我可以在该函数上设置断点(然后我可以在其中找出哪些对象正在泄漏)适本地处理它们)。
问题是,每次程序运行时,地址的前几部分都会发生变化。例如,第一次“泄漏”地址可能是0x10c10
,下一次可能是0x20c10
。最后几位数字始终相同,但前几位不同。
有没有办法可以只比较最后几位数字?我正在考虑使用 mod,但我无法想出任何有效的方法。这些是常规整数,而不是字符串或任何东西。
最佳答案
您可以通过将按位 &
运算符与代表您要比较的位数的掩码应用到十六进制数的最后 N 位数字来进行比较。例如,要比较最后三个十六进制数字,请应用三个 F
的掩码,如下所示:
uintptr_t a = ...
uintptr_t b = ...
if ((a&0xFFF) == (b&0xFFF)) {
...
}
您还可以检查最后 N 位数字中是否有零,如下所示:
if ((a^b)&0xFFF == 0) {
...
}
话虽如此,您的整体方法可能不是最佳的,因为内存分析器,例如 valgrind ,让您可以检测内存泄漏,而无需通过地址操作进行跳跃。
如果出于某种原因,本地分析是唯一的选择,您可以使用 special macros for retrieving source file locations ,并将它们与泄漏位置的地址一起保存在哈希表中。这将让您回到源代码中负责分配的位置,而根本不需要操作地址。
关于c++ - 如何测试数字是否以值结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40179597/