gpt4 book ai didi

c++ - 如何测试数字是否以值结尾?

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:09 25 4
gpt4 key购买 nike

我的程序有内存泄漏。我已将对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com