【发布时间】:2013-01-07 04:10:14
【问题描述】:
我正在尝试内存分配和删除,并且对如何正确删除/释放内存有疑问。下面是一小段代码:
#include <windows.h>
#include <vector>
#include <iostream>
using namespace std;
int main() {
cout << "Initial" << endl;
system("Pause");
double* Array = new double[50000];
for(int i = 0; i < 50000; i++)
{
Array[i] = rand();
}
cout << "Array created" << endl;
system("Pause");
delete[] Array;
cout << "Array deleted" << endl;
system("Pause");
return 1;
}
在每次系统暂停期间,我使用 Windows 任务管理器检查我的应用程序正在使用多少内存。以下是我的结果中的数字:
- 初始 744 KB
- 阵列已创建 1120 KB
- 数组已删除 1124 KB
那么我在 C++ 教育中是否遗漏了什么?调用delete[]后,分配给数组的内存不应该被释放吗?
【问题讨论】:
-
这已经被问了一千次了。您的问题的基本前提是
delete[]应该立即导致您在 Windows 中的进程内存减少,并且没有中间缓存层等等,这是有缺陷的。实际上有几个——您的数组在进程的虚拟内存空间中被取消分配,但这几乎不会导致该内存立即物理返回给操作系统。 -
操作系统比你更擅长管理内存。
delete释放虚拟内存块,这并不意味着任务管理器会立即将其报告为返回。查看规范以了解delete指定做什么(而不是您认为它*应该做什么)。 -
要研究内存管理,您需要检查用于数据的内存,而不是代码。任务管理器显示的是后者而不是前者。你需要使用像 valgrind 这样的工具来检查前者。
-
我建议阅读this question 及其答案。