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

标签 c++ c memory-leaks

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

相关文章:

调用模板化内部类静态成员函数的 C++ 语法?

c - 如何为超出范围的数组提供可变存储大小?

c - 使用 # 和 ## 运算符的嵌套宏实现

ios - ViewController deinit 后 UIImageView 内存泄漏

具有数据成员结构的构造函数初始化列表的 c++ 语法?

c++ - 用于端口转发的 libssh2 示例代码

c - 在 C 中的循环内分配和释放内存

c# - 位图和 hBitmap 内存泄漏

c++ - 打印 boost::graph edge_descriptor

c - 在 C 中,我不确定指针的输出是如何更新的?