您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> C语言 >> 辅导 >> 正文    
  C语言最大难点揭秘[2] 【注册男护士专用博客】          

C语言最大难点揭秘[2]

www.nanhushi.com     佚名   不详 

  清单 2. 来自资源错误管理的潜在堆内存丢失
               
 int getkey(char *filename)
 {
     FILE *fp;
     int key;

     fp = fopen(filename, "r");
     fscanf(fp, "%d", &key);
     return key;
        }
   


  fopen 的语义需要补充性的 fclose。在没有 fclose() 的情况下,C 标准不能指定发生的情况时,很可能是内存泄漏。其他资源(如信号量、网络句柄、数据库连接等)同样值得考虑。

  内存错误分配

  错误分配的管理不是很困难。下面是一个示例(请参见清单 3):


  清单 3. 未初始化的指针
               
 void f2(int datum)
 {
     int *p2;

                /* Uh-oh!  No one has initialized p2. */
            *p2 = datum;
        ...
        }
    


  关于此类错误的好消息是,它们一般具有显著结果。在 AIX® 下,对未初始化指针的分配通常会立即导致 segmentation fault 错误。它的好处是任何此类错误都会被快速地检测到;与花费数月时间才能确定且难以再现的错误相比,检测此类错误的代价要小得多。

  在此错误类型中存在多个变种。free() 释放的内存比 malloc() 更频繁(请参见清单 4):


  清单 4. 两个错误的内存释放
               
 /* Allocate once, free twice. */
 void f3()
 {
     char *p;

     p = malloc(10);
      ...
            free(p);
      ...
            free(p);
        }

        /* Allocate zero times, free once. */
 void f4()
 {
     char *p;

                /* Note that p remains uninitialized here. */
     free(p);
 }
    


 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目