Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;,即使调用delete,进程何时仍保留分配的内存?_C++_Memory_Gcc_Memory Management - Fatal编程技术网

C++ 在C++;,即使调用delete,进程何时仍保留分配的内存?

C++ 在C++;,即使调用delete,进程何时仍保留分配的内存?,c++,memory,gcc,memory-management,C++,Memory,Gcc,Memory Management,我想了解在以下情况下GCC运行时发生了什么 我有一个C++程序,分配许多块内存,然后删除它们。令人费解的是,GCC运行时没有将内存返回到操作系统。相反,它仍然由我的程序保存,我假设我想在不久的将来分配类似的内存块 以下程序演示了发生的情况: #include <iostream> using namespace std; void pause1() { cout << "press any key and enter to continue"; char

我想了解在以下情况下GCC运行时发生了什么

<>我有一个C++程序,分配许多块内存,然后删除它们。令人费解的是,GCC运行时没有将内存返回到操作系统。相反,它仍然由我的程序保存,我假设我想在不久的将来分配类似的内存块

以下程序演示了发生的情况:

#include <iostream>
using namespace std;

void pause1()
{
    cout << "press any key and enter to continue";
    char ch;
    cin >> ch;
}

void allocate(int size)
{
    int **array = new int*[size];
    for (int c = 0; c < size; c++) {
        array[c] = new int;
    }
    cout << "after allocation of " << size << endl;
    for (int c = 0; c < size; c++) {
        delete array[c];
    }
    delete [] array;
}

int main() {
    cout << "at start" << endl;
    pause1();
    int size = 1000000;
    for (int i = 0; i < 3; i++) {
        allocate(size);
        cout << "after free" << endl;
        pause1();
        size *= 2;
    }
    return 0;
}
#包括
使用名称空间std;
无效暂停1()
{
cout>ch;
}
无效分配(整数大小)
{
整数**数组=新整数*[大小];
对于(int c=0;ccout这取决于,通常情况下,如果您使用的是Linux机器,底层malloc将开始分配堆中的内容,并且它将增长,但是如果您释放一些大的内部块,它将无法释放任何内容,直到释放堆的顶部,因为它唯一能做的就是增加或减少堆

因此,如果您分配一个大的块,然后分配一个较小的块,然后释放bug块,那么可能会发生这样的情况:它们被按顺序放置,并且在释放较小的块之前,您的进程将无法减小堆的大小


在您当前的示例中,可能会发生这样的情况:您不使用的第一个空闲区正在等待下一次分配,而后来由于您在其上分配了某些内容而无法释放。或者,在给定的内存大小之前,它不会开始释放。

C库使用的内存分配器根据h以各种方式分配内容内存块有多大。当内存被释放时,页面并不总是返回到操作系统,特别是当您进行许多小的分配时

内存只能逐页返回到操作系统,不能用于小的分配

如果您真的需要了解,请检查C库源代码并对其进行测试等


C++中,可以重写容器的分配器来执行自己的内存管理——然后可以做任何你想做的事情(例如MMAP/DEV/0或任何)

为什么会出现这个问题?它会导致内存不足吗?问题是在内存使用率较高的情况下,由于交换而导致机器减速;如果应用程序实际释放了内存,我希望避免这种情况。除非您自己进行内存管理,否则很少会将这些内容返回操作系统。标准内存管理(我看过的实现)保留了操作系统提供的所有内容。 2648kb - at start 18356kb - after allocating and freeing 1,000,000 ints 2780kb - after allocating and freeing 2,000,000 ints 65216kb - after allocating and freeing 4,000,000 ints