有什么方法可以识别可用的内存地址吗?

Any way can identify memory address usable?

本文关键字:地址 内存 识别 什么 方法      更新时间:2023-10-16

示例代码如下:

#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#1addr#2会打印相同的地址。 但是有没有办法识别它可以免费使用的地址?

有人说,除非你重新分配NULLnullptraddr来识别这一点,否则这是不可能的。好的,那么如果指针指向一个对象,并且该对象被删除,结果是一样的吗?

您可以自由包装并始终注意初始化指针。

void myfree(void **ptr)
{
free(*ptr);
*ptr = NULL;
}

所以每个空闲都会分配值 NULL。如果指针为 NULL,则可以签入程序。这只是某种解决方法

我知道addr#1和addr#2会打印相同的地址。但是有没有 如何识别可以免费使用的地址?

确定一段内存是否由malloc分配的理想方法是将指向该内存段的指针设置为NULL,包括所有其他可能指向原始内存的指针。

好的,那么如果指针指向一个对象,并且该对象被删除,结果是一样的吗?

仅仅因为释放了一段内存并不意味着最初在该内存位置的内容将立即被删除。你可以调用它,看看你原来有什么,一些随机的东西,或者你的程序可能会崩溃;这是未定义的行为。 当您说"删除"时,我假设您是在暗示释放先前分配的内存。

有人说这是不可能的,除非你重新分配 NULL 或 nullptr 到 addr 来识别

这里有一个有趣的答案 Kennytm 如何检查指针是否已经在 C 中释放? 通过使用mcheckmprobe,这些函数挂malloc并在堆上预执行恒常性检查。您可以有效地进行一系列检查来确定变量是否已释放,更多信息在这里,但这些函数纯粹用于调试,NULL传递分配的内存是安全的方法。

我知道addr#1和addr#2会打印相同的地址。但是,有什么方法可以识别一个免费使用的地址吗?

不容易或便携。这特定于 C 运行时库的行为,因此完全取决于实现细节。此外,这是未定义的行为(释放后使用(。

例如,您需要使用堆检查例程(如 GCCmprobe(在运行时查询状态。

有人说这是不可能的,除非你重新分配 NULL 或 nullptr 到 addr 来识别它。

不,这只会改变对该特定内存的使用或状态的看法。它没有根据实际拥有和管理此信息的运行时库说明系统的状态。

好的,那么如果指针指向一个对象,并且该对象被删除,结果是一样的吗?

是的,无论是指向对象的指针还是指向 POD 的指针(如示例中所示(,结果都是相同的。

传统观点认为,如果您遵循与内存管理相关的某些规则和最佳实践,则永远不必担心此类问题。

这整个问题是使用智能指针的一个很好的激励示例!然后整个问题就消失了。