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

文章作者 100test 发表时间 2007:08:06 13:21:58
来源 100Test.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).
}



src="/ncre2/js/wxgg.js">

相关文章


C语言最大难点揭秘[3]
C语言最大难点揭秘[2]
C语言最大难点揭秘[1]
c开发策略-之-错误处理
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛