假设有一个变量a
和一个指针p
,它指向a
的地址。
int a;
int *p=&a;
现在因为我有一个指针指向变量的位置,所以我知道确切的内存位置(或内存块)。
我的问题是:
答案 0 :(得分:3)
答案 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.
答:可以像上面那样完成,但也可以使用malloc
,calloc
,strdup
,{{1}的一些PRELOADED库本地完成通过手动指令的内存分配功能,您可以保存分配的地址和大小。并且还通过free
或__builtin_return_address()
保存返回地址,以了解内存块的分配位置。您必须将所有分配的地址和大小保存到树中。然后你应该能够查询属于哪个块和块大小的地址,以及分配块的功能。