有什么方法可以识别可用的内存地址吗?
Any way can identify memory address usable?
示例代码如下:
#include <iostream>
using namespace std;
int main()
{
int* addr = (int*)malloc(100);
cout << "Hello World" << endl;
printf("addr#1=%pn",addr);
free(addr);
printf("addr#2=%pn",addr);
return 0;
}
我知道addr#1
和addr#2
会打印相同的地址。 但是有没有办法识别它可以免费使用的地址?
有人说,除非你重新分配NULL
或nullptr
给addr
来识别这一点,否则这是不可能的。好的,那么如果指针指向一个对象,并且该对象被删除,结果是一样的吗?
您可以自由包装并始终注意初始化指针。
void myfree(void **ptr)
{
free(*ptr);
*ptr = NULL;
}
所以每个空闲都会分配值 NULL。如果指针为 NULL,则可以签入程序。这只是某种解决方法
我知道addr#1和addr#2会打印相同的地址。但是有没有 如何识别可以免费使用的地址?
确定一段内存是否由malloc
分配的理想方法是将指向该内存段的指针设置为NULL
,包括所有其他可能指向原始内存的指针。
好的,那么如果指针指向一个对象,并且该对象被删除,结果是一样的吗?
仅仅因为释放了一段内存并不意味着最初在该内存位置的内容将立即被删除。你可以调用它,看看你原来有什么,一些随机的东西,或者你的程序可能会崩溃;这是未定义的行为。 当您说"删除"时,我假设您是在暗示释放先前分配的内存。
有人说这是不可能的,除非你重新分配 NULL 或 nullptr 到 addr 来识别
这里有一个有趣的答案 Kennytm 如何检查指针是否已经在 C 中释放? 通过使用mcheck
和mprobe
,这些函数挂malloc
并在堆上预执行恒常性检查。您可以有效地进行一系列检查来确定变量是否已释放,更多信息在这里,但这些函数纯粹用于调试,NULL
传递分配的内存是安全的方法。
我知道addr#1和addr#2会打印相同的地址。但是,有什么方法可以识别一个免费使用的地址吗?
不容易或便携。这特定于 C 运行时库的行为,因此完全取决于实现细节。此外,这是未定义的行为(释放后使用(。
例如,您需要使用堆检查例程(如 GCCmprobe
(在运行时查询状态。
有人说这是不可能的,除非你重新分配 NULL 或 nullptr 到 addr 来识别它。
不,这只会改变你对该特定内存的使用或状态的看法。它没有根据实际拥有和管理此信息的运行时库说明系统的状态。
好的,那么如果指针指向一个对象,并且该对象被删除,结果是一样的吗?
是的,无论是指向对象的指针还是指向 POD 的指针(如示例中所示(,结果都是相同的。
传统观点认为,如果您遵循与内存管理相关的某些规则和最佳实践,则永远不必担心此类问题。
这整个问题是使用智能指针的一个很好的激励示例!然后整个问题就消失了。
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- CUDA:统一内存和指针地址的更改
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 如何读取特定地址的进程内存?
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- LLVM 传递以在特定地址分配内存
- 无法将内存地址转换为值
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 获取 R 数据帧的内存地址
- 如何配置bazel以运行地址/内存清理器?
- 存储 std::list 元素的地址;内存
- 确定库的地址内存