注:本文最初發表在csai的blog
http://blog.csai.cn/user1/16781/archives/2006/6646.html# 上,現在在這里做個備份。
最初發現這個問題是在VChelp.net的論壇上, 原貼的問題描述如下:
原貼地址: http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=178091&forum_id=
對它只知道皮毛,GlobalAlloc(GNN, 175)返回NULL
現象如下:
1. 內存還多呢! 不明白比爾的任務管理器對它好使否?
2. 據說 它只能分配6000個HGLOBAL, 會不會和它有關系!? //我如何知道是否超過這個數了呢?
3. 我們軟件有一個工具, 來監測和它相關的函數, 發現沒有泄漏//那個工具應該不會有問題吧!
我從來沒有用過這東西, 流行這東西的時候, 我還不知道什么叫cpp呢, 有經驗的人來幫忙啦~~~~~~~
針對上述描述1和描述2, 我寫了一段代碼測試了一下, 還真的會出現返回為NULL的情況. 相關代碼如下:
HGLOBAL g[80000];
memset(g, 0, sizeof(g));
int m = 0;
for(unsigned long i = 0; i < 80000; i++)
{
g[i] = ::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, 175);
if(g[i] == NULL)
{
m++; // 這里加個斷點
}
}
測試一下這段代碼, 我發現 i = 65535 以后, 申請的都是NULL. 也就是說, GlobalAlloc最多只能成功申請65535次, 其它的申請操作將返回NULL.