查询内存位置
Query about memory location
假设有一个变量a
和一个指向a
地址的指针p
。
int a;
int *p=&a;
现在,由于我有一个指向变量位置的指针,因此我知道确切的内存位置(或内存块)。
我的问题是:
- 给定一个地址,我们能找到哪个变量正在使用它们吗?(我认为这是不可能的)。
- 给定一个地址,我们至少能找到该内存地址所属的内存块有多大。(我知道这很愚蠢,但仍然如此)。
- 您可以枚举所有(可疑)变量,并检查它们是否指向与指针相同的位置(例如,您可以比较指针的相等性)
- 如果指针定义为 int *p,则可以假定它指向一个整数。当然,您的假设可能会被证明是错误的,例如,如果指针值为空或您干预了指针的值。
您可以将内存视为一个大的字节数组:
现在,如果您有一个指向数组中间某处的指针,您能告诉我有多少其他指针指向与您的指针相同的位置吗?或者你能告诉我我存储在内存位置你指向它的信息吗?或者您至少可以告诉我在您的指针位置存储了什么样的对象?回答所有这些问题真的是不可能的,这个问题看起来很奇怪。某些语言在其内存管理例程中添加了额外的信息,他们可以在以后跟踪此类信息,但C++我们的开销最小,因此您的答案是否定的,这是不可能的。
对于您的第一个问题,您可以使用智能指针来处理它,例如shared_ptr
使用参考计数器来了解有多少shared_ptr
指向内存位置并能够控制对象的生命周期(但当前的shared_ptr
设计不允许您读取该计数器)。
有非标准的平台相关解决方案来查询动态分配内存的大小(例如 Windows 上的_msize
和 Unix 上的memory_size
),但仅适用于使用malloc
分配的动态内存并且不可移植,C++的想法是你应该关心这一点,如果您需要此功能,请为它实现解决方案,如果您不需要它, 那么你永远不需要支付额外的费用
给定一个地址,我们能找到哪个变量正在使用它们吗?
不,这是不可能的。 变量指向内存,而不是相反。没有办法从编译的代码中获取变量名,除了可能通过符号表,读取哪个反过来可能需要弄乱汇编。
给定一个地址,我们至少能找到内存块有多大吗 该内存地址所属的内存地址。
不。仅给定地址就没有办法做到这一点。您可以在取消引用地址后找到sizeof(),但不能从地址本身找到。
问题 1。
一个:它不能在本地完成,但可以通过Valgrind memcheck工具完成。VM 跟踪所有变量和分配的内存空间/堆栈。但是,它不是为了回答这样的问题而设计的,但是通过一些修改,memcheck工具可以回答这个问题。例如,它可以将无效的内存访问或内存泄漏地址与源代码中的变量相关联。因此,给定一个有效且已知的内存地址,它必须能够找到相应的变量。
问题2.
答:可以像上面一样完成,但也可以使用一些预加载的库来完成,用于malloc
、calloc
、strdup
、free
等。通过手动指示的内存分配功能,您可以保存分配的地址和大小。并且还可以通过__builtin_return_address()
或backtrace()
保存返回地址,以了解内存块的分配位置。您必须将所有分配的地址和大小保存到树中。然后,您应该能够查询地址属于哪个块和块大小,以及分配了块的函数。
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 内存所有位置 wxWidgets
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 向量的内存位置不连续
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 常量引用的内存位置
- C++强制变量到一个固定的内存位置
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 为什么存储在内存位置的值会发生变化?
- 在特定内存位置构造 c++ 对象
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 如何识别内存泄漏的位置
- 内存位置出现Microsoft C++异常:std::out_of_range
- 函数,返回变量c++占用的内存位置的大小
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- delete如何知道对象在内存中的起始位置
- 无法在 Opencv 中显示图像导致内存位置
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"