【问题标题】:How to test if a number ends in a value?如何测试一个数字是否以一个值结尾?
【发布时间】:2016-10-21 14:44:19
【问题描述】:

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

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

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

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

【问题讨论】:

  • mod(我假设你的意思是%)怎么不起作用?这么简单的数学题,怎么会不行呢?
  • 只是掩码:addr = number & 0x0000FF;
  • 不保证不同进程的内存映射相同,即使不同的进程运行同一个可执行文件。甚至没有任何地址的最后一位。
  • 您最好使用valgrindDrMemory 等专用工具。
  • “如何测试一个数字是否以一个值结尾” - 什么?一个数字一个值。您使用哪种语言? C 还是 C++?你的代码在哪里?你应该学习How to Ask并提供minimal reproducible example

标签: c++ c memory-leaks


【解决方案1】:

您可以通过将按位& 运算符应用于十六进制数的最后 N 位数字,并使用表示您希望比较的位数的掩码来比较它。例如,要比较最后三个十六进制数字,请应用三个 Fs 的掩码,如下所示:

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,并将它们与泄露位置的地址一起保存在哈希表中。这将让您回到源代码中负责分配的位置,而根本无需操作地址。

【讨论】:

  • 谢谢!忘了valgrind,我现在正在使用它。效果很好!
  • 该标准仅保证与uintptr_t 之间的转换(并且严格只针对void *),没有对值进行算术运算。话说,这闻起来像是 XY 问题。
  • @Olaf 我同意这个问题的 XY 特征。这就是答案的后半部分。谢谢!
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多