首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

关于GlobalAlloc分配内存失败的有关问题。机子物理内存足够

2012-01-07 
关于GlobalAlloc分配内存失败的问题。机子物理内存足够我用GlobalAlloc分配内存来保存位图数据,//Allocate

关于GlobalAlloc分配内存失败的问题。机子物理内存足够
我用GlobalAlloc分配内存来保存位图数据,
//Allocate memory for DIB
hDIB = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);
if (hDIB == 0)
{
int error = ::GetLastError();
CString tem_str;
tem_str.Format("%d",error);
tem_str = _T("error code = ")+tem_str;
AfxMessageBox(tem_str);
return false;
}
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
但是发现一个问题,在打开几张80M的bmp位图后,在运行到这里就会分配内存失败,提示errorcode是8,我查了,是内存不足。但是我打开任务管理器看内存还是6,700m的样子,而且我机子是2G的内存,物理内存是足够的,但是为什么在程序中会分配内存失败呢,谢谢各位。

[解决办法]
应用程序使用的是虚拟内存,看看进程占用的虚拟内存是多少,再看一下页面文件的剩余空间有多少。
[解决办法]
GlobalAllocEx
[解决办法]

探讨
我在进程里面看,程序才使用十几M的内存啊。而且可用的内存有1G。

[解决办法]
这个问题太简单了,因为超过16M空间GlobalAlloc就会出错--不是一定出错,就是很可能出错。

这时候应该使用VirtualAlloc和VirtualFree来操作。

这不是我的经验,而是在剽窃别人代码时在注解行俩面的偶然发现哈:)
[解决办法]
http://msdn.microsoft.com/zh-cn/library/aa366574(v=VS.85).aspx

Note The global functions have greater overhead and provide fewer features than other memory management functions. New applications should use the heap functions unless documentation states that a global function should be used. For more information, see Global and Local Functions.

MSDN推荐使用 HeapAlloc and HeapFree
[解决办法]
内存分配出现的问题很难断定,但是一般情况下,出现“问题”的地方并不是根源所在。

据我个人的经验,很多原因是别的地方的代码出现了错误(比如,overwrite了堆栈、corrupt了heap表),从而导致后续的看似不可能的分配错误发生。

所以,你最好仔细看看其他地方的代码有没有把内存搞坏的逻辑。

热点排行