我有一个简单的测试C程序,该程序泄漏4个字节的内存:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* x = malloc(sizeof(int));
printf( "Address: %p\n", x);
return 0;
}
我使用进行编译gcc -o leak leak.c
,然后运行它:
$ leak
Address: 0x55eb2269a260
然后,我创建另一个测试C程序,该程序将尝试释放泄漏的内存:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
void *addr = (void*)0x55eb2269a260;
printf( "Trying to free address: %p\n", addr);
free(addr);
return 0;
}
我用它编译gcc -o myfree free.c
,然后运行它:
$ myfree
Trying to free address: 0x55eb2269a260
Segmentation fault (core dumped)
这是怎么回事 为什么无法释放泄漏的内存?
假设我们正在谈论类似Unix的操作系统(这也适用于Windows和大多数其他现代操作系统)...
这是怎么回事 为什么无法释放泄漏的内存?
首先:每个运行的进程都有其自己的虚拟地址空间(或VAS
)。这VAS
是操作系统必须在不同进程之间布置和组织物理内存的方式。在32位处理器上,它的范围从0x0到0xFFFFFFFF,并包含该进程的所有内存-它的代码,静态数据,堆栈,堆等,都在进程中VAS
。虚拟地址(或VA
)是虚拟地址空间内的特定地址。
当您使用malloc
系统分配内存时,系统将在进程堆上搜索有效的未分配内存,如果找到,则返回其指针(即,malloc
实质上返回虚拟地址)。
该过程结束后,VAS
操作系统将自动“释放”它,以使内存不再有效,或不再分配内存。另外,每个进程都有自己的虚拟地址空间。您不能使用另一个进程的VAS
(虚拟地址)直接访问一个进程(虚拟地址空间)VA
,因为这样做实际上是在尝试访问VA
正在运行的进程中的进程,这在您的示例中很可能导致未处理的ACCESS_VIOLATION
异常并导致进程崩溃。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句