你能从一个单独的程序中删除动态分配的内存吗?

Can you delete dynamically allocated memory from a separate program?

这个问题纯属好奇。最近了解到,如果是在Heap中动态分配的内存space,删除是非常重要的。我的问题是,如果内存 space 的地址是,是否可以使用不同的 C++ 程序(从创建内存 space 的程序)删除动态分配的内存 space知道吗?

这是一个例子:

CODE01.CPP

#include <iostream>
using namespace std;

int main() {
    int *a = new int;
    cout << a;
    int foo;
    cin >> foo;  // for blocking the program from closing.
    return 0;
}

CODE01.CPP 的输出(比方说)

0x7c1640

CODE02.CPP

#include <iostream>
using namespace std;

int main() {
    int *a = (int*)0x7c1640;
    delete a;
    return 0;
}

这行得通吗?如果我先 运行 code01.cpp 然后立即 code02.cpp 会删除堆中的内存吗?

任何现代 OS 都会为这两个程序创建一个单独的虚拟地址 space。因此,您在 code01.cpp 中打印的地址仅与该程序相关,您无法从 code02.cpp.

访问地址 space

所以回答你的直接问题:运行 cpp02.cpp 不会以任何方式影响静态 运行 cpp01.cpp 的状态。

在大多数现代操作系统上,简短的回答是否定的。 大多数操作系统使用 virtual memory,这意味着程序 A 中的 0x7c1640 不一定是程序 B 中的 0x7c1640。为了实现这一点,您必须为此编写一个没有内存保护的自定义 OS,此时任何程序都可以覆盖任何其他程序,这是一个主要的安全漏洞。

A​​ related question 提供了下图虚拟地址是如何被占用的。每个程序都会得到一个 OS 转换的假内存地址,因此每个程序都会得到一个不同的堆,并且不能通过内存直接相互交互,至少在公共虚拟内存系统上是这样。

分配给操作系统的工作之一是确保一个进程不会损害另一个进程。这意味着防止一个进程以任何方式直接影响另一个进程使用的内存。

有几种机制可以解决这个问题,但它们都打败了这个想法

"If I know the value of a pointer used in that process, then I can do something to it's memory from this processes."

因为这正是 OS 应该预防


也就是说,许多 OS 提供了特殊的通道(用于进程间通信),您可以滥用这些通道来允许类似的事情。但是你必须努力,细节取决于 OS.