首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Visual C++ > 从把流式对象隐式转换成指针的行为中吸取经验
【标  题】:从把流式对象隐式转换成指针的行为中吸取经验
【关键字】:指针
【来  源】:网络

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

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

#include<iostream>

#include<fstream>

using namespace std;

int main()

{

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

       file://…use i

i.close();

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

}

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

while(i)//

{

       file://…do somethine

}

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

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

ifstreami(“data.txt”);

file://…use i

i.close();

file://不需要在此使用delete了

使代码在不同编译器下通用运行:【上一篇】
实现Office的COM插件:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • ES310-chapter1:SUN Storage Introduction
  • 校影视ftp迁移方案
  • 文件测试
  • JMS简介(java message server)
  • IT业的又一个春天来临?美国IT就业人数创历史新高
  • 图形图象网络安全
  • 在Linux下建立强大的FTP搜索引擎
  • dojo远程过程调用
  • 为Redhat Enterprise Linux的两个字体子系统添加字体
  • [C_Linux_IO]标准C语言IO与Unix/Linux IO API比较(草稿)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.