C++ 在C++;,即使调用delete,进程何时仍保留分配的内存?
我想了解在以下情况下GCC运行时发生了什么 <>我有一个C++程序,分配许多块内存,然后删除它们。令人费解的是,GCC运行时没有将内存返回到操作系统。相反,它仍然由我的程序保存,我假设我想在不久的将来分配类似的内存块 以下程序演示了发生的情况: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
#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;c cout这取决于,通常情况下,如果您使用的是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