visual c++ delete不会释放所有内存(Windows)
visual C++ delete does not free all memory (Windows)
我需要帮助来理解我在Windows上的内存分配和释放问题。我正在使用VS11编译器(VS2012 IDE),目前最新更新(更新3 RC)。
问题是:我为一个二维数组动态分配一些内存,并立即释放它。尽管如此,在内存分配之前,我的进程内存使用量在分配之前是0,3 MB,在分配259,6 MB(预计因为分配了32768个64位整数(8字节)数组),分配期间为4106,8 MB,但在释放后内存不会下降到预期的0,3 MB,而是停留在12,7 MB。因为我正在释放我所占用的所有堆内存,所以我希望内存恢复到0.3 MB。
这是我使用的c++代码:
#include <iostream>
#define SIZE 32768
int main( int argc, char* argv[] ) {
std::getchar();
int ** p_p_dynamic2d = new int*[SIZE];
for(int i=0; i<SIZE; i++){
p_p_dynamic2d[i] = new int[SIZE];
}
std::getchar();
for(int i=0; i<SIZE; i++){
for(int j=0; j<SIZE; j++){
p_p_dynamic2d[i][j] = j+i;
}
}
std::getchar();
for(int i=0; i<SIZE; i++) {
delete [] p_p_dynamic2d[i];
}
delete [] p_p_dynamic2d;
std::getchar();
return 0;
}
我确定这是重复的,但我还是要回答:
如果您正在查看任务管理器大小,它将给您进程的大小。如果没有"压力"(您的系统有足够的可用内存,并且没有进程处于饥饿状态),那么减少进程的虚拟内存使用是没有意义的——进程在处理数据时以循环模式增长、收缩、增长、收缩,然后释放在一个处理周期中使用的数据,为下一个处理周期分配内存,然后再次释放内存,这种情况并不罕见。如果操作系统"恢复"这些页面的内存,只需要给他们再次回到你的过程,这将是一个浪费的处理能力(将和unassigning页面分配给一个特定的过程并不完全微不足道的,特别是如果你不能确定这些页面属于首先,因为他们需要"清洗"充满了零个或其他一些常数,确保"新主人"不能使用内存旧数据的"钓鱼",例如查找存储在内存中的密码])。
即使页面仍然属于这个进程,但是没有被使用,实际的RAM也可以被另一个进程使用。因此,如果页面有一段时间没有发布,也没什么大不了的。
此外,在调试模式下,c++运行时将在经过delete
的所有内存中存储"此内存已被删除"。这是为了帮助识别"免费后使用"。因此,如果您的应用程序在调试模式下运行,那么永远不要期望释放任何已释放的内存。它会被重复使用。因此,如果您将代码运行三次,它的大小不会增长到原来的三倍。
- std矢量内存分配linux与windows编译器
- Windows Media Foundation MFCreateSourceReaderFromURL 函数中的内存泄
- 测量任何 Windows 可执行文件的内存使用情况和执行时间
- Windows API SIZE_T在内存和控制台中不显示相同的值
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- C/C++ Windows 或 Linux 将随机内存块映射成连续的顺序
- 在 Windows 中使用 C++ 可以分配的动态内存的最大大小是多少?
- cv:内存位置的异常 - 运行 openCV 代码 Visual Studio 2013 & Visual Studio 2017 - Windows 7
- Windows 10 是否保护您不访问其他程序正在使用的内存?
- 在特定 Windows DLL 模块中分配内存
- Windows 正在获取待机内存C++
- 通用 Windows 平台上的内存泄漏检测
- C Windows如何从内存打开文件
- Windows 32 位 mfc 应用程序的虚拟内存中的地址
- 如何将x64机器代码写入虚拟内存并在C++中为Windows执行
- C++:从程序、Windows和Linux中测量内存使用情况
- 使用nodejs在Windows中读取过程的内存值
- 何时使用虚拟内存(windows)
- visual c++ delete不会释放所有内存(Windows)
- 共享命名内存(Windows)