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会不一致.求解.
测试代码如下:// 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会不一致.求解.
解决方案 »
- 关于recvfrom返回-1超时怎解
- 请各位高手帮我解释下下面这段代码,谢谢了!
- 怎么在程序中移动桌面快捷方式的位置?
- 初学者请大家帮帮忙.关于dll的小问题
- 用mfc生成的RichEditView工程中,输入的文字为粗体,怎样才能去掉粗体,我的代码没有起作用
- 花了一天时间写了个smtp、pop3小程序,极其垃圾,可以看看原理
- 怎样实现VC与SQL的连接?怎么操作数据库??
- 这样的字符数组该如何赋值?
- 大侠帮帮我!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 有问题!!!!!请帮帮忙!!!!!
- 100求助:Teechart控件如何在极坐标下作图
- 程序在其他机子上不能跑,是控件NTGraph和NTgraph3D的问题吗?
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填充。
test.exe(release) start时 new内存 delete 内存
管理器中内存大小: 1092KB 11404KB 1104KB
11404 - 1092 = 10312
11404 - 1104 = 10300
与实际内存相比较,10300 - 10240 = 60KB如果每次分配内存需要额外的信息:60/10 = 6KB,难道额外信息每次分配需要10KB显然这是不可能的.对于说使用任务管理器查看内存不准确,那么使用什么软件可以达到准确查看内存的目的呢?请各位指教,谢谢.