WEB开发网
开发学院操作系统Linux/Unix 内存调试技巧 阅读

内存调试技巧

 2008-11-13 08:31:57 来源:WEB开发网   
核心提示: 清单 2. 来自资源错误管理的潜在堆内存丢失int getkey(char *filename){FILE *fp;int key;fp = fopen(filename, "r");fscanf(fp, "%d", &key);return key

清单 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);
  }

上一页  1 2 3 4 5 6 7 8  下一页

Tags:内存 调试 技巧

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接