9

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

int a;
int *p=&a;

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

我的问题是:

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

4 回答 4

3
  1. 您可以枚举所有(可疑)变量并检查它们是否指向与您的指针相同的位置(例如,您可以比较指针是否相等)
  2. 如果您的指针被定义为 int *p,您可以假设它指向一个整数。当然,您的假设可能会被证明是错误的,例如,如果指针值为 null 或者您干预了指针的值。
于 2012-11-06T10:54:15.453 回答
2

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

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

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

有非标准平台相关的解决方案来查询动态分配内存的大小(例如_msize在 Windows 和memory_sizeUnix 上),但仅适用于使用分配malloc且不可移植的动态内存,在 C++ 中,您应该注意这一点,如果您需要此功能,请为其实施解决方案,如果您不需要它,那么您永远不会为此支付额外费用

于 2012-11-06T11:13:04.457 回答
2

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

不,这是不可能的。变量指向内存,而不是相反。没有办法从编译的代码中获取变量名,除了可能通过符号表,读取哪个反过来可能需要弄乱汇编。


给定一个地址,我们至少可以找到该内存地址所属的内存块有多大。

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

于 2012-11-06T10:50:17.633 回答
1

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

问题 2.
A:可以像上面那样做,但也可以用一些 PRELOADED 库为malloc, calloc, strdup,free等本地完成。通过手动指示的内存分配函数,您可以节省分配的地址和大小。__builtin_return_address()并且还通过或backtrace()知道内存块被分配的位置保存返回地址。您必须将所有分配的地址和大小保存到树中。然后你应该可以查询地址属于哪个chunk和chunk大小,以及哪个函数分配了chunk。

于 2012-11-06T13:11:06.873 回答