C++中没有finally,那么应该在哪里关闭资源?

良少
博客专家认证
2006-06-10 10:52:34
C++中没有finally,那么应该在哪里关闭资源?

C++的try{}catch(){},为什么没有finally{}块来释放资源?
如类中的一个方法,局部变量
File * file=NULL;
Try{
file=fopen(“aaa.txt”,”r”);
然后执行一些操作。
}
最后fclose(file);
假如,file操作时发生异常,需要关闭。对于Java来说,是在finally{}块中关闭。不论是否发生异常,一定会关闭!
而C++中呢,怎样保证一定关闭这个文件呢?
...全文
5575 88 打赏 收藏 转发到动态 举报
写回复
用AI写文章
88 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjlsmail 2007-04-06
  • 打赏
  • 举报
回复
"r" --> "w"/"w+"/"a"/"a+"
wb19822002 2006-08-07
  • 打赏
  • 举报
回复
lz确实有些概念比较混乱
wb19822002 2006-08-07
  • 打赏
  • 举报
回复
只有这里的file是一个成员函数内部的局部变量。 因为,没有类里面的其他方法需要创建这个file对象。
如果放在构造器中,那么每个对象都要提供一个文件来载入。 而我的这个类根本就没有这样的要求。
所以,它必须是一个函数内的局部变量。
--------------------------------------------------------
用RAII包裹后,再作为函数内的局部变量也是可以的呀?????????????

另外,如果lz觉得最好在堆上分配,可以使用auto_ptr + RAII
不长树的叶子 2006-07-16
  • 打赏
  • 举报
回复
有没有学过C++问这样的问题,搞行一堆人像要打架似的
vipismez 2006-07-15
  • 打赏
  • 举报
回复
路过。
cxyol 2006-07-12
  • 打赏
  • 举报
回复
mark
axiuluo 2006-07-03
  • 打赏
  • 举报
回复
RAII + boost::shared_ptr应该可以解决你的问题了。
如果嫌定义资源包装类太麻烦,考虑实现一个scopeGuard模板类,在退出范围之前自动调用特定的函数。
superyys 2006-07-02
  • 打赏
  • 举报
回复
try
{
File *f=fopen();
操作文件
}
catch
{
}
fclose(f);
直接写后面不就行了吗?如果catch里没有再次throw,无论怎么样都会执行到fclose的.
JAVA和delphi发明的finally我认为是多此一举,当然,如果你用C++Builder,也可以体验一下非标准的__finally,有异曲同工之妙.
zhuixun5506 2006-06-22
  • 打赏
  • 举报
回复
studying ..
pjie131 2006-06-22
  • 打赏
  • 举报
回复
mark
wjlsmail 2006-06-21
  • 打赏
  • 举报
回复
请问是什么缘故? 多谢
wjlsmail 2006-06-21
  • 打赏
  • 举报
回复
// 如下代码 Debug 版本没有问题,Release 版本不能运行

FILE * fp;
try
{
fp = fopen("b.txt", "r"); // b.txt 不存在
fwrite("aaaaaaaa", 10, 1, fp); // Release版本在这句出错
}
catch(...)
{
printf("Write file error!");
if (fp)
{
fclose(fp);
fp = NULL;
}
}
if (fp)
{
printf("Write file right!");
fclose(fp);
fp = NULL;
}
getchar();
ahao 2006-06-21
  • 打赏
  • 举报
回复
mark
gogowhy 2006-06-21
  • 打赏
  • 举报
回复
m
庄鱼 2006-06-19
  • 打赏
  • 举报
回复
C++里并不需要finally,有关java里所说的问题,在C++中是不存在的,相反,有了那种东西反而会带来问题,因为finally设置本身就是一种无用的垃圾。我前面说过了,java里有那种东西是一种没得办法的办法,纯属无奈之举,在C++里还把它当宝贝似的显眼,一窝蜂的跟风,不让人笑话吗!
况且,更重要的是,java所运用的finally机制并不安全,如果现在就有量子计算机,那首先就是个漏洞。目前之所以还没有暴露其危害性,还跟关键领域应用少有关。
kingfly 2006-06-19
  • 打赏
  • 举报
回复
finally并不是标准C++的一部分,现在大家所试用的_finally是各个编译器厂商的扩充.<The C++ Programming Language>作者Bjarne Stroustrup认为finally在C++里面是多余的,它所作的工作应该由析构函数来作.
良少 2006-06-18
  • 打赏
  • 举报
回复
我决定使用Boost的智能指针方案。
Loki的太先进了,不会。
Hp的GC方案,太难看了。侵入性太强。
lonelyforest 2006-06-15
  • 打赏
  • 举报
回复
郁闷, 直接写个类不就行了吗?
constructer 启动资源。
destructer 释放资源。
dreamXren 2006-06-15
  • 打赏
  • 举报
回复
呵呵,好多N人。
在try{块内,只要出现new或者open诸如此类的资源申请,处理不当,都有可能出现leak。

上面说的RAII,我不知道,但是发现我一直在用。
(我已经将文件诸如此类的封装起来了,不想老是判断返回值,文件操作出错就抛异常,
又快又省事)
但是比如你需要一个1K左右的BYTE空间,这个一般会new出来(或者写一个类来专门管理开辟字节空间??倾向于前者),就会出现lz想说的问题了。

没有什么好办法,两层try,catch估计效率不高。
你自己定义一个空类。class A { }
BYTE* p = NULL;
try {
try {
p = new BYTE[1024];
//other operation, may throw exception
throw A(); // 先不释放,在后面释放。
}catch(FileException& e) {
//exception process
throw A();
}
} catch (A& e)
{
// 现在才释放内存。
delete[] p;
// 还有什么异常需要抛的,在这里抛。
}
femalelover 2006-06-15
  • 打赏
  • 举报
回复
C++中有个final不知何意,MSDN没装全.
加载更多回复(68)

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧