【发布时间】:2016-02-07 02:57:19
【问题描述】:
在编写应用程序时,我认为使用 3 维动态分配的数组会很方便,因为有索引。但是我无法使用它,因为它占用的内存比我预期的要多。请有人解释一下这背后的算术是什么。为什么在下面的示例中 var2 需要大约。 640 MB 内存而不是 256 MB。在 Dev-C++ 5.11 64 位中测试
#include <iostream>
#include <conio.h>
#include <windows.h>
int main(void)
{
using namespace std ;
MEMORYSTATUS memInfo ;
memInfo.dwLength = sizeof(memInfo) ;
unsigned char *var0 ;
unsigned char **var1 ;
unsigned char ***var2 ;
GlobalMemoryStatus(&memInfo) ;
cout << "Free memory:\t" << (memInfo.dwAvailPhys / 1024 / 1024) << " MB" << endl ;
var0 = new unsigned char[1024 * 1024 * 256] ;
for(int aa = 0; aa < 1024 * 1024 * 256; aa++)
var0[aa] = 0x00 ;
GlobalMemoryStatus(&memInfo) ;
cout << "Free memory:\t" << (memInfo.dwAvailPhys / 1024 / 1024) << " MB" << endl ;
delete[] var0 ;
cout << endl ;
GlobalMemoryStatus(&memInfo) ;
cout << "Free memory:\t" << (memInfo.dwAvailPhys / 1024 / 1024) << " MB" << endl ;
var1 = new unsigned char*[128 * 1024] ;
for(int aa = 0; aa < 128 * 1024; aa++)
var1[aa] = new unsigned char[1024] ;
for(int aa = 0; aa < 128 * 1024; aa++)
for(int bb = 0; bb < 1024; bb++)
var1[aa][bb] = 0x00 ;
GlobalMemoryStatus(&memInfo) ;
cout << "Free memory:\t" << (memInfo.dwAvailPhys / 1024 / 1024) << " MB" << endl ;
delete[] var1 ;
cout << endl ;
GlobalMemoryStatus(&memInfo) ;
cout << "Free memory:\t" << (memInfo.dwAvailPhys / 1024 / 1024) << " MB" << endl ;
var2 = new unsigned char**[16 * 1024] ;
for(int aa = 0; aa < 16 * 1024; aa++)
var2[aa] = new unsigned char*[1024] ;
for(int aa = 0; aa < 16 * 1024; aa++)
for(int bb = 0; bb < 1024; bb++)
var2[aa][bb] = new unsigned char[16] ;
for(int aa = 0; aa < 16 * 1024; aa++)
for(int bb = 0; bb < 1024; bb++)
for(int cc = 0; cc < 16; cc++)
var2[aa][bb][cc] = 0x00 ;
GlobalMemoryStatus(&memInfo) ;
cout << "Free memory:\t" << (memInfo.dwAvailPhys / 1024 / 1024) << " MB" << endl ;
// Why does var2 takes approx. 640 MB of memory ?. 16 *1024 * 1024 * 16 = 256 MB
cout << "\nPress a key to exit." << endl ;
getch() ;
return 0 ;
}
【问题讨论】:
-
我不知道这是否重要 - 我正在运行 Windows Server 2008 R2
标签: c++ arrays memory-management