从把流式对象隐式转换成指针的行为中吸取经验

ZDNet软件频道 时间:2003-08-12 作者:ZDNet China |  我要评论()
本文关键词:cpptips
看看下面的程序。它在任何符合标准的编译器中编译,都是能够完全通过的。但是,它允许删除了一个不是指针的对象,这一行为却是匪夷所思的。

看看下面的程序。它在任何符合标准的编译器中编译,都是能够完全通过的。但是,它允许删除了一个不是指针的对象,这一行为却是匪夷所思的。

#include<iostream>

#include<fstream>

using namespace std;

int main()

{

       ifstream &i = *new ifstream(“data.txt”);

       //…use i

i.close();

delete i; // 应当使用“delete &i”; 但仍能通过编译

}

为什么会这样了?实际上,它再正常不过了。所有fstream类的对象都有一个 void* 转换操作符。当在程序中,需要使用指针时,这个操作符就会自动被隐式调用。这种转换可以使你把文件对象当作指针看待,十分相像于C语言中的 FILE* 变量。另外,它也能使你可以在布尔表达式中直接使用流式对象,如下面所示:

while(i)//

{

       //…do somethine

}

但是,上述的转换同样也使得编译器的安全机制受到了破环,允许程序员删除错误的指针(并非真正的指针)。

综上所述,我们可以得到三条结论。首先,要小心意外地把流式对象放到了需要真正指针的地方;其次,认识到转换操作符会有多危险,因此要特别小心的使用它们;最后,要知道避免这个bug——只需简单使用静态对象,让编译器自动处理静态对象的分配和释放;而不是使用动态内存分配,并在后面手动释放动态对象

ifstreami(“data.txt”);

//…use i

i.close();

//不需要在此使用delete了

 



责任编辑:炒饭

欢迎评论投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134