关于malloc申请内存/使用的问题

时间:2021-02-11 03:16:46
环境:
vs2008,win 7 x64.

为了模拟系统内存不足,我用malloc申请了大片的内存。在debug模式下面运行程序,然后再TaskManager里面看到指定数量的内存被消耗了。

然后我在release模式下运行,结果发现TaskManager里面的内存没有任何动静!
然后我对每个申请的内存块进行数据置0,这时TaskManager里面的可用内存才减少。

代码片段如下:

bool SPTMemory::EatMemory(long long memToBeEaten)
{
         int m_memApplied = 0;
         int SPT_MB = 1024*1024;
do
{
void *p = malloc(SPT_MB);
if(NULL !=p)
{
this->m_cmemAllocated.push_back(p);
//((char*)p)[0] = 'a';
//memset(p,0,SPT_MB);//加上这句才能在release模式下正常工作。
m_memApplied += SPT_MB;
printf("1 MB eaten at %p\n",p);
p=NULL;
}else
return false;
}while(m_memApplied < memToBeEaten);

return true;
}


有人能就这个现象对windows下面的内存分配做个简单的解释吗?

8 个解决方案

#1


不了解,关注

#2


关注一下,debug版本,内存由编译器进程申请,release版本则由自身申请,猜的。

#3


虚拟内存吧,等到用的时候才具体分配,估计是这样。

#4


记得一个大牛说过:内存的申请,如果没有使用,系统只给你 一页关于malloc申请内存/使用的问题

#5


优化掉了吧
你调试release版看看

#6


maybe 是因为在你不知道的时候 内存找就分配给它了

#7


引用 5 楼 akirya 的回复:
优化掉了吧
你调试release版看看


release版不好调试,在malloc后面打印p的值,结果是有分配实际地址的。

#8


分是分配了,分配出来的是虚拟内存,在磁盘上,因为你没有使用到你分配出来的内存,所以操作系统就没有将其换入到物理内存。当你把分配出来的内存置0时,操作系统就必须要将其换入到物理内存后才能置0.因此就占物理内存了。
至于debug模式为什么就在物理内存里面了,可能是因为编译器的原因。

#1


不了解,关注

#2


关注一下,debug版本,内存由编译器进程申请,release版本则由自身申请,猜的。

#3


虚拟内存吧,等到用的时候才具体分配,估计是这样。

#4


记得一个大牛说过:内存的申请,如果没有使用,系统只给你 一页关于malloc申请内存/使用的问题

#5


优化掉了吧
你调试release版看看

#6


maybe 是因为在你不知道的时候 内存找就分配给它了

#7


引用 5 楼 akirya 的回复:
优化掉了吧
你调试release版看看


release版不好调试,在malloc后面打印p的值,结果是有分配实际地址的。

#8


分是分配了,分配出来的是虚拟内存,在磁盘上,因为你没有使用到你分配出来的内存,所以操作系统就没有将其换入到物理内存。当你把分配出来的内存置0时,操作系统就必须要将其换入到物理内存后才能置0.因此就占物理内存了。
至于debug模式为什么就在物理内存里面了,可能是因为编译器的原因。