查询内存位置

时间:2012-11-06 10:47:25

标签: c++ c pointers memory-management

假设有一个变量a和一个指针p,它指向a的地址。

int a;
int *p=&a;

现在因为我有一个指针指向变量的位置,所以我知道确切的内存位置(或内存块)。

我的问题是:

  1. 给定一个地址,我们可以找到哪个变量正在使用它们吗? (我认为这不可行)。
  2. 给定一个地址,我们至少可以发现该内存地址所属的内存块有多大。 (我知道这很愚蠢,但仍然)。

4 个答案:

答案 0 :(得分:3)

  1. 您可以枚举所有(可疑)变量并检查它们是否指向与指针相同的位置(例如,您可以比较指针的相等性)
  2. 如果指针定义为int * p,则可以假设它指向一个整数。当然,如果例如指针值为null或者您使用指针的值进行插入,那么您的假设可能被证明是错误的。

答案 1 :(得分:2)

  

给定一个地址,我们能找到哪个变量正在使用它们吗?

不,这是不可能的。变量指向内存,而不是相反。从编译代码中获取变量名称还有一些方法,除非可能通过符号表读取,反过来可能需要弄乱汇编。


  

给定一个地址,我们至少可以发现大块的内存有多大   该内存地址属于哪个..

没有。只给出地址,没有办法做到这一点。 您可以在取消引用地址后找到 sizeof(),但不能从地址本身找到。

答案 2 :(得分:2)

您可以将内存视为一个大字节数组:

现在如果你有一个指向数组中间某处的指针,你能告诉我有多少其他指针指向同一个位置作为你的指针?或者你能告诉我你在内存位置存储了多少信息吗?或者你至少可以告诉我你的指针位置存储了什么样的对象?回答所有这个问题是不可能的,问题看起来很奇怪。有些语言在他们的内存管理例程中添加了额外的信息,以便他们可以在以后跟踪这些信息,但在C ++中我们有最小的开销,所以你的答案是不可能的。

对于您的第一个问题,您可以使用智能指针处理它,例如shared_ptr使用引用计数器来了解有多少shared_ptr指向内存位置并且能够控制生命周期对象(但shared_ptr的当前设计不允许您读取该计数器。)

有一个非标准的平台相关解决方案来查询动态分配的内存大小(例如Windows上的_msize和Unix上的memory_size),但这只适用于使用{{1}分配的动态内存并且不可移植,在C ++中你应该关心这个想法,如果你需要这个功能为它实现一个解决方案,如果你不需要它,那么你永远不需要支付额外费用

答案 3 :(得分:1)

问题1.
答:它无法原生完成,但可以通过Valgrind memcheck工具完成。 VM跟踪所有变量并分配内存空间/堆栈。但是,它不是为回答这个问题而设计的,但通过一些修改,memcheck工具可以回答这个问题。例如,它可以将无效的内存访问或内存泄漏地址与源代码中的变量相关联。因此,给定一个有效且已知的内存地址,它必须能够找到相应的变量。

问题2.
答:可以像上面那样完成,但也可以使用malloccallocstrdup,{{1}的一些PRELOADED库本地完成通过手动指令的内存分配功能,您可以保存分配的地址和大小。并且还通过free__builtin_return_address()保存返回地址,以了解内存块的分配位置。您必须将所有分配的地址和大小保存到树中。然后你应该能够查询属于哪个块和块大小的地址,以及分配块的功能。