从数组中释放内存

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#)

删除智能指针的内存释放不起作用[重复]

在其内存应该已被释放后访问可变长度数组

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

在 Java 中删除部分数组以释放堆内存