S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

GlobalAlloc返回Null的可能性

Posted on 2008-12-20 23:27 S.l.e!ep.¢% 阅读(270) 评论(0)  编辑 收藏 引用 所属分类: VC
注:本文最初发表在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.


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理