从数组中释放内存
Posted
技术标签:
【中文标题】从数组中释放内存【英文标题】:Freeing Memory From An Array 【发布时间】: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[]后,分配给数组的内存不应该被释放吗?
【问题讨论】:
阅读***.com/a/8611456/726361和***.com/a/13039464/726361 这已经被问了一千次了。您的问题的基本前提是delete[]
应该立即导致您在 Windows 中的进程内存减少,并且没有中间缓存层等等,这是有缺陷的。实际上有几个——您的数组在进程的虚拟内存空间中被取消分配,但这几乎不会导致该内存立即物理返回给操作系统。
操作系统比你更擅长管理内存。 delete
释放虚拟内存块,这并不意味着任务管理器会立即将其报告为返回。查看规范以了解delete
指定做什么(而不是您认为它*应该做什么)。
要研究内存管理,您需要检查用于数据的内存,而不是代码。任务管理器显示的是后者而不是前者。你需要使用像 valgrind 这样的工具来检查前者。
我建议阅读this question 及其答案。
【参考方案1】:
不,你没有错过任何东西。只是任务管理器并没有告诉你全部真相(好吧,它并没有从你需要的角度告诉你真相)。当您程序调用delete[]
时,内存被释放以供程序重用,但不会返回给操作系统。从您的程序的角度来看,内存已被释放:您下一次调用new
将占用相同的内存块。但从操作系统(和任务管理器)的角度来看,程序仍然会占用内存。
要查看发生了什么情况,请多次运行分配,并循环释放分配,并查看任务管理器中的内存总量没有从第一次之后获得的“高水位线”上升分配。
【讨论】:
【参考方案2】:这取决于您使用的编译器。对于某些编译器,删除的内存由应用程序持有,不会立即返回到操作系统。 抱歉,我现在找不到有关它的官方链接。
【讨论】:
以上是关于从数组中释放内存的主要内容,如果未能解决你的问题,请参考以下文章
C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )