在 C 中进程退出后访问未释放的地址



>假设我有一个简单的代码,它分配一个大小为 4 字节的内存块并打印地址:

int32_t *ptr = malloc(4);
*ptr = 90; //for debugging
printf("%pn", ptr);
//did not freed

现在,当我执行此操作时(我执行了 6 次(,我很困惑地看到一个地址被分配了两次:

$ ./t
0xb6cca008
$ ./t
0xb6cca008
$ ./t
0xb6d4a008
$ ./t
0xb6d8a008
$ ./t
0xb6d8a008
$ ./t
0xb6d0a008
$

如果尝试打印上述地址的值,期望得到 90,我反而会得到一个烦人的分段错误。

访问地址值的代码:

int32_t *ptr = (int32_t *) 0xb6cca008;
printf("%dn", *ptr);

这里值得注意的是地址的外观0xb6cca008和连续0xb6d8a008。我以为马洛克不使用相同的地址?

问题可能出在我这边,因为我使用的是termux,一个安卓中的Linux终端模拟器。我从未使用过安装了 linux 的真实 PC,所以我不知道分段错误是否会出现或会打印 90。

由于 4 字节是在堆上分配的,并且在程序终止后没有释放,它不应该存在并且不会给出分段错误吗?我也怀疑这也是"访问违规"。

常见 CPU 上的现代操作系统(某些嵌入式系统等一些例外(会在进程完成时释放进程映射的内存,无论您是否调用free()。这意味着,即使只有一个地址空间,您仍然可以在多次运行中看到相同的指针。

此外,每个进程都有自己的地址空间,这意味着多个进程例行共享相同的地址。因此,您可能有一个指向同一虚拟地址的指针,但实际上它们指向不同的物理地址。这称为虚拟内存。

最新更新