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

C++ 如何测试数字是否以值结尾?,c++,c,memory-leaks,C++,C,Memory Leaks,我的程序内存泄漏。我已将对malloc(和new)的所有调用替换为对我自己的函数的调用,该函数跟踪分配的内容。在程序结束时,我比较了开始时分配的东西和结束时分配的东西,以得到所有“泄漏”的东西的列表 最终目标是获取“泄漏”位置的列表,并将它们放入一个数组中。每次分配某个内容时,都会根据“泄漏”地址列表进行检查,如果存在匹配项,它会调用一个特殊函数,然后我可以在该函数上设置断点(在该函数上,我可以找出哪些对象正在泄漏,并适当地处理它们) 问题是,每次程序运行时,地址的前几个部分都会更改。例如,第一

我的程序内存泄漏。我已将对
malloc
(和
new
)的所有调用替换为对我自己的函数的调用,该函数跟踪分配的内容。在程序结束时,我比较了开始时分配的东西和结束时分配的东西,以得到所有“泄漏”的东西的列表

最终目标是获取“泄漏”位置的列表,并将它们放入一个数组中。每次分配某个内容时,都会根据“泄漏”地址列表进行检查,如果存在匹配项,它会调用一个特殊函数,然后我可以在该函数上设置断点(在该函数上,我可以找出哪些对象正在泄漏,并适当地处理它们)

问题是,每次程序运行时,地址的前几个部分都会更改。例如,第一次,一个“泄漏”地址将是
0x10c10
,下一次,它可能是
0x20c10
。最后几位数字总是相同的,但前几位不是


有没有办法只比较最后几个数字?我在考虑使用mod,但我没能想出任何有效的方法。这些是常规整数,而不是字符串或任何东西。

您可以对十六进制数的最后N位进行比较,方法是对其应用按位
&
运算符,并使用表示要比较的位数的掩码。例如,要比较最后三个十六进制数字,请应用三个
F
s的掩码,如下所示:

uintptr_t a = ...
uintptr_t b = ...
if ((a&0xFFF) == (b&0xFFF)) {
    ...
}
if ((a^b)&0xFFF == 0) {
    ...
}
您还可以检查数字的异或,以查找最后N位中的零,如下所示:

uintptr_t a = ...
uintptr_t b = ...
if ((a&0xFFF) == (b&0xFFF)) {
    ...
}
if ((a^b)&0xFFF == 0) {
    ...
}
尽管如此,您的总体方法可能是次优的,因为内存探查器(例如)可以让您检测内存泄漏,而无需通过地址操作跳转


如果出于某种原因,自产的评测是唯一的方法,那么您可以使用,并将它们与泄漏位置的地址一起保存在哈希表中。这将允许您返回到源代码中负责分配的位置,而无需操纵地址。

mod
(我想您的意思是
%
)怎么不起作用?这是一个简单的数学,怎么可能不起作用呢?只需屏蔽:
addr=number&0x0000FF不保证不同进程的内存映射相同,即使不同进程运行相同的可执行文件。甚至连地址中的最后一位都没有。你最好使用一个专用的工具,比如or。“如何测试一个数字是否以一个值结尾”-什么?数字是一个值。你用哪种语言?C还是C++?你的密码在哪里?你应该学习并提供一份工作。谢谢!忘了valgrind,我现在正在用它。很好!本标准仅保证与
uintptr\u t
之间的转换(严格来说,仅适用于
void*
),对值不进行算术运算。他说,这闻起来像是一个XY问题。@Olaf我同意这个问题的XY特征。这就是答案的后半部分。谢谢