C 语言最大难点揭秘[2]
2008-02-23 05:39:40来源:互联网 阅读 ()
清单 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);
}
这些错误通常也不太严重。尽管 C 标准在这些情形中没有定义具体行为,但典型的实现将忽略错误,或快速而明确地对他们进行标记;总之,这些都是安全情形。
[1] [2] [3] [4]
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C语言面试题大汇总之华为面试题
下一篇: C#处理数码相片之马赛克的实现
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash