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
记得一个大牛说过:内存的申请,如果没有使用,系统只给你
一页。
#5
优化掉了吧
你调试release版看看
你调试release版看看
#6
maybe 是因为在你不知道的时候 内存找就分配给它了
#7
release版不好调试,在malloc后面打印p的值,结果是有分配实际地址的。
#8
分是分配了,分配出来的是虚拟内存,在磁盘上,因为你没有使用到你分配出来的内存,所以操作系统就没有将其换入到物理内存。当你把分配出来的内存置0时,操作系统就必须要将其换入到物理内存后才能置0.因此就占物理内存了。
至于debug模式为什么就在物理内存里面了,可能是因为编译器的原因。
至于debug模式为什么就在物理内存里面了,可能是因为编译器的原因。
#1
不了解,关注
#2
关注一下,debug版本,内存由编译器进程申请,release版本则由自身申请,猜的。
#3
虚拟内存吧,等到用的时候才具体分配,估计是这样。
#4
记得一个大牛说过:内存的申请,如果没有使用,系统只给你
一页。
#5
优化掉了吧
你调试release版看看
你调试release版看看
#6
maybe 是因为在你不知道的时候 内存找就分配给它了
#7
release版不好调试,在malloc后面打印p的值,结果是有分配实际地址的。
#8
分是分配了,分配出来的是虚拟内存,在磁盘上,因为你没有使用到你分配出来的内存,所以操作系统就没有将其换入到物理内存。当你把分配出来的内存置0时,操作系统就必须要将其换入到物理内存后才能置0.因此就占物理内存了。
至于debug模式为什么就在物理内存里面了,可能是因为编译器的原因。
至于debug模式为什么就在物理内存里面了,可能是因为编译器的原因。