是否可以将泄漏的内存从另一个进程中释放出来?

HåkonHægland

我有一个简单的测试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)

这是怎么回事 为什么无法释放泄漏的内存?

Andresantacruz

假设我们正在谈论类似Unix的操作系统(这也适用于Windows和大多数其他现代操作系统)...

这是怎么回事 为什么无法释放泄漏的内存?

首先:每个运行的进程都有其自己的虚拟地址空间(或VAS)。VAS是操作系统必须在不同进程之间布置和组织物理内存的方式。在32位处理器上,它的范围从0x0到0xFFFFFFFF,并包含该进程的所有内存-它的代码,静态数据,堆栈,堆等,都在进程中VAS虚拟地址(或VA)是虚拟地址空间内的特定地址。

当您使用malloc系统分配内存时,系统将在进程堆上搜索有效的未分配内存,如果找到,则返回其指针(即,malloc实质上返回虚拟地址)。

该过程结束后,VAS操作系统将自动“释放”,以使内存不再有效,或不再分配内存。另外,每个进程都有自己的虚拟地址空间。您不能使用另一个进程的VAS(虚拟地址)直接访问一个进程(虚拟地址空间)VA,因为这样做实际上是在尝试访问VA正在运行的进程中的进程,这在您的示例中很可能导致未处理的ACCESS_VIOLATION异常并导致进程崩溃。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

CIImage 没有从 Swift 中的内存中释放出来

从其他活动中获取相机后,是否有任何方法可以将其从其他活动中释放出来?

Linux中的某个进程是否可以更改另一个进程的UID?

如果我将POD结构分配给另一个POD结构,是否存在内存泄漏?

是否将char *指向另一个字符串文字泄漏内存?

是否可以将智能指针的内存重用于另一个对象?

释放另一个进程正在使用的文件

从另一个进程访问mmap内存

C#读取另一个进程内存

Haskell,读取另一个进程的内存

在将变量分配给另一个值之前删除它是否可以解决任何内存问题?

是否可以将 &self 传递给 rust 中的另一个函数

是否可以将SELECT IN应用于另一个SELECT的临时表中?

是否可以将json推送到函数内部的另一个json中

是否可以将存储过程结果传递给ColdFusion中的另一个cfstoredproc?

是否可以将XOR约束链接到UML中的另一个XOR约束?

在另一个分支中是否可以将更改推送到主分支

是否可以将“ find -exec”嵌套在另一个“ find -exec”中?

是否可以将构造函数用作TypeScript中另一个函数的参数类型?

是否可以将指令应用于另一个组件模板中的组件?

是否可以将 map 方法实现到另一个 map 方法中?

内存泄漏-如何为在另一个结构中作为线程参数传递的Typdef结构分配内存?

是否可以将一个片段的输出包含在另一个片段中?

是否可以将一个类的方法导入Python中的另一个类?

java属性文件中是否可以将一个变量指向另一个变量?

是否可以将一个 Caffe 的 prototxt 文件包含在另一个中?

是否可以将一个CSS文件包含在另一个文件中?

是否可以将一个数组添加到另一个数组中

是否可以将一个React App加载到另一个React App中?