C语言难点揭秘[2]
清单2。资源错误管理可能导致堆内存丢失
int getkey(char * filename)
{
file * FP;
int key;
fp = fopen(文件名,“r”);
fscanf(fp," %d ",& key);
返回键;
}
fopen的语义需要补充fclose。如果没有fclose(),当C标准不能指定发生了什么时,很可能是内存泄漏。其他资源(如信号量、网络句柄、数据库连接等。)也值得考虑。
内存分配错误
错误管理并不十分困难。下面是一个例子(参见清单3):
清单3。未初始化的指针
void F2(int datum)
{
int * p2;
/*啊哦!没有人初始化p2。*/
* p2 = datum;
...
}
关于此类错误的好消息是,它们通常会产生重大影响。在AIX & reg,未初始化指针的分配通常会立即导致分段故障错误。它的优点是任何这样的错误将被快速检测到;与需要几个月才能确定且难以重现的错误相比,检测此类错误的成本要低得多。
这种错误类型有多种变体。Free()比malloc()更频繁地释放内存(参见清单4):
清单4。两次错误的内存释放
/*分配一次,释放两次。*/
void F3()
{
char * p;
p = malloc(10);
...
免费(p);
...
免费(p);
}
/*分配零次,免费一次。*/
void F4()
{
char * p;
/*注意p在这里保持未初始化。*/
free(p);
}
0条评论