你能从一个单独的程序中删除动态分配的内存吗?
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.
这个问题纯属好奇。最近了解到,如果是在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
.
所以回答你的直接问题:运行 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.