【发布时间】:2019-10-11 15:06:53
【问题描述】:
这个问题纯粹是出于好奇。我最近了解到,如果在 Heap 中动态分配内存空间,那么删除内存空间非常重要。我的问题是,如果内存空间的地址已知,是否可以使用不同的 C++ 程序(从创建内存空间的程序)删除动态分配的内存空间?
这是一个例子:
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,堆中的内存会被删除吗?
【问题讨论】:
-
明确一点,在CODE01中,程序结束时内存会被清空。如果您的对象有析构函数,它可能无法正确清理。但在这种情况下,您处理的是
int,所以没关系。如果您关心内存,分配的内存总是在程序结束时释放。 -
那你学错了。一旦程序终止,所有内存都会交还给操作系统
-
现代操作系统将为每个进程提供单独的虚拟地址空间。这些地址在进程之间毫无意义。
-
@MarekR 我不明白为什么这太宽泛了?只需回答说明内存空间未共享即可。这是个好问题。
-
常见的现代桌面平台不支持此功能。有一些旧平台(今天不常用)可以做到这一点(例如,具有操作系统分配内存块的旧 Amiga,具有协作内存块管理的旧 Mac)。可能有现代嵌入式平台也可能提供该功能(可执行覆盖和共享内存池)。
标签: c++ memory-management virtual-address-space