Posted on 2008-12-20 23:27
S.l.e!ep.¢% 閱讀(271)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
VC
注:本文最初發(fā)表在csai的blog
http://blog.csai.cn/user1/16781/archives/2006/6646.html# 上,現(xiàn)在在這里做個(gè)備份。
?? 最初發(fā)現(xiàn)這個(gè)問題是在VChelp.net的論壇上, 原貼的問題描述如下:
?? 原貼地址: http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=178091&forum_id=
??? 對它只知道皮毛,GlobalAlloc(GNN, 175)返回NULL
??? 現(xiàn)象如下:
??? 1. 內(nèi)存還多呢! 不明白比爾的任務(wù)管理器對它好使否?
??? 2. 據(jù)說 它只能分配6000個(gè)HGLOBAL, 會(huì)不會(huì)和它有關(guān)系!? //我如何知道是否超過這個(gè)數(shù)了呢?
??? 3. 我們軟件有一個(gè)工具, 來監(jiān)測和它相關(guān)的函數(shù), 發(fā)現(xiàn)沒有泄漏//那個(gè)工具應(yīng)該不會(huì)有問題吧!
?? 我從來沒有用過這東西, 流行這東西的時(shí)候, 我還不知道什么叫cpp呢, 有經(jīng)驗(yàn)的人來幫忙啦~~~~~~~
??? 針對上述描述1和描述2, ?我寫了一段代碼測試了一下, 還真的會(huì)出現(xiàn)返回為NULL的情況. 相關(guān)代碼如下:
????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++; // 這里加個(gè)斷點(diǎn)
????????}
????}
?? 測試一下這段代碼,??我發(fā)現(xiàn) i = 65535 以后, 申請的都是NULL. 也就是說, GlobalAlloc最多只能成功申請65535次, 其它的申請操作將返回NULL.