C语言难点揭秘[2],第1张

C语言难点揭秘[2],第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);
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C语言难点揭秘[2]

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情