new内存大小为什么和任务管理器中显示的内存大小一致:
测试代码如下:// test.cpp : 测试内存大小
//
#include "stdafx.h"
#include <Windows.h>#define bufSize 10char *pbuf[bufSize];void testnewm(void);
void testfreem(void);int _tmain(int argc, _TCHAR* argv[])
{
printf("Start \n"); getchar();
printf("new 内存\n");
testnewm(); getchar();
printf("delete 内存\n");
testfreem(); getchar();
return 0;
}void testnewm(void)
{
for(int i = 0 ; i < bufSize ; i++){
pbuf[i] = new char[1024*1024];     //1M数据大小
if(pbuf[i] != NULL){
memset(pbuf[i],0x01,1024*1024);  //填充值
}else{
printf("new char error \n");
}
}
}void testfreem(void)
{
for(int i = 0 ; i < bufSize ; i++){
if(pbuf[i] != NULL){
delete[] pbuf[i];
}
}
}
a.编译执行
b.打开任务管理器,找到该进程并查看当前内存大小
c.结果如下
test.exe            start时    new内存     delete 内存
管理器中内存大小:   1288KB     11604KB     1304KB
根据上述值计算:
11604-1288 = 10316 kb
11604-1304 = 10300 KB实际new的内存大小是:1024 * 10= 10240 KB为什么管理器中看到的10316KB会大于实际的10240KB.为什么管理器中new看到的10316KB和delete看到的10300会不一致.求解.

解决方案 »

  1.   

     在VC里面,用release模式编译运行程序的时候,堆分配(Heap allocation)的时候调用的是malloc,如果你要分配10byte的空间,那么就会只分配10byte空间,而用debug模式的时候,堆分配调用的是_malloc_dbg,如果你只要分配10byte的空间,那么它会分配出除了你要的10byte之外,还要多出约36byte空间,用于存储一些薄记信息,debug堆分配出来之后就会按顺序连成一个链。      那么我们再来看看薄记信息中有些什么。还是上面10byte分配空间的例子,那么分配出的10byte空间的前面会有一个32byte的附加信息,存储的是一个_CrtMemBlockHeader结构,可以在DBGINT.H中找到该结构的定义:
    typedef struct _CrtMemBlockHeader
    {
    // Pointer to the block allocated just before this one:
       struct _CrtMemBlockHeader *pBlockHeaderNext;
    // Pointer to the block allocated just after this one:
       struct _CrtMemBlockHeader *pBlockHeaderPrev;
       char *szFileName;    // File name
       int nLine;                  // Line number
       size_t nDataSize;      // Size of user block
       int nBlockUse;         // Type of block
       long lRequest;          // Allocation number
    // Buffer just before (lower than) the user's memory:
       unsigned char gap[nNoMansLandSize];
    } _CrtMemBlockHeader; 
    /* In an actual memory block in the debug heap,
     * this structure is followed by:
     *   unsigned char data[nDataSize];
     *   unsigned char anotherGap[nNoMansLandSize];
     */
    结构中的_CrtMemBlockHeader结构两个指针就不用解释是干嘛的了,szFileName是存储的发起分配操作的那行代码所在的文件的路径和名称,而nLine则是行号。nDataSize是请求分配的大小,我们的例子里当然就是10了,nBlockUse是类型,而lRequest是请求号。最后一项gap,又称NoMansLand,是4byte(nNoMansLandSize=4)大小的一段区域,注意看最后几行注释就明白了,在这个结构后面跟的是用户真正需要的10byte数据区域,而其后还跟了一个4byte的Gap,那么也就是说用户申请分配的区域是被一个头结构,和一个4byte的gap包起来的。在释放这10byte空间的时候,会检查这些信息。Gap被分配之后会被以0xFD填充。
      

  2.   

    1楼的说法,有道理,但我把程序运行在release模式下也无法把内存消耗值和实际分配值建立起对等关系:
    test.exe(release) start时    new内存   delete 内存
    管理器中内存大小:    1092KB   11404KB  1104KB
    11404 - 1092 = 10312
    11404 - 1104 = 10300
    与实际内存相比较,10300 - 10240 = 60KB如果每次分配内存需要额外的信息:60/10 = 6KB,难道额外信息每次分配需要10KB显然这是不可能的.对于说使用任务管理器查看内存不准确,那么使用什么软件可以达到准确查看内存的目的呢?请各位指教,谢谢.