【问题标题】: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[]后,分配给数组的内存不应该被释放吗?

【问题讨论】:

  • 这已经被问了一千次了。您的问题的基本前提是delete[] 应该立即导致您在 Windows 中的进程内存减少,并且没有中间缓存层等等,这是有缺陷的。实际上有几个——您的数组在进程的虚拟内存空间中被取消分配,但这几乎不会导致该内存立即物理返回给操作系统。
  • 操作系统比你更擅长管理内存。 delete 释放虚拟内存块,这并不意味着任务管理器会立即将其报告为返回。查看规范以了解delete 指定做什么(而不是您认为它*应该做什么)。
  • 要研究内存管理,您需要检查用于数据的内存,而不是代码。任务管理器显示的是后者而不是前者。你需要使用像 valgrind 这样的工具来检查前者。
  • 我建议阅读this question 及其答案。

标签: c++ arrays memory


【解决方案1】:

不,你没有错过任何东西。只是任务管理器并没有告诉你全部真相(好吧,它并没有从你需要的角度告诉你真相)。当您程序调用delete[] 时,内存被释放以供程序重用,但不会返回给操作系统。从您的程序的角度来看,内存已被释放:您下一次调用new 将占用相同的内存块。但从操作系统(和任务管理器)的角度来看,程序仍然会占用内存。

要查看发生了什么情况,请多次运行分配,并循环释放分配,并查看任务管理器中的内存总量没有从第一次之后获得的“高水位线”上升分配。

【讨论】:

    【解决方案2】:

    这取决于您使用的编译器。对于某些编译器,删除的内存由应用程序持有,不会立即返回到操作系统。 抱歉,我现在找不到有关它的官方链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2015-09-05
      • 2015-10-19
      相关资源
      最近更新 更多