专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VC

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

发布时间:2011-06-23 14:26:05 文章来源:www.iduyao.cn 采编人员:星星草
关于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表),从而导致后续的看似不可能的分配错误发生。

所以,你最好仔细看看其他地方的代码有没有把内存搞坏的逻辑。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: