c++如何实现finally?

forster 2010-09-09 05:28:45
忽然发现c++没finally
下面的代码就会泄露内存。

try
{
A* pA = new A;//memory leak

throw 1;
}
catch(...)
{
}

但是让我写成这样又太不爽,和c一样了不能随时声明

A* pA;
try
{
pA = new A;//no memory leak

throw 1;
}
catch(...)
{
}

delete pA;

有什么好办法?
...全文
690 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdsnghw 2011-08-28
  • 打赏
  • 举报
回复
如果全局资源而且不涉及指针释放呢?智能指针也就无效了吧,只能能通过自定义对象并且使用局部变量实现了.
比如doSth 和 undoSth,begintrans/rollback,lock/unlock,open/close.
Tony2251 2011-07-21
  • 打赏
  • 举报
回复
mark
上善若水邻 2010-09-09
  • 打赏
  • 举报
回复
呵呵。。。我想到用goto语句,谁知道不可以跳到try中去 、、、、晕了
看来只能用大家推荐的智能指针了。
Jim_King_2000 2010-09-09
  • 打赏
  • 举报
回复
你的需求用智能指针就可以。C++中没有finally,也不需要finally。SEH中有__finally,不过不可移植。
forster 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cloudhsu 的回复:]
Q: 为何C++不提供“finally”结构?
A: 因为C++提供了另一种机制,完全可以取代finally,而且这种机制几乎总要比finally工作得更好:就是——“分配资源即初始化”。(见《The C++ Programming Language》14.4节)基本的想法是,用一个局部对象来封装一个资源,这样一来局部对象的析构函数就可以自动释放资源。这样,程序员就不会“忘记释放资源”了。 [译……
[/Quote]
但是new时就郁闷了
就是正常不需要释放所以不能用局部,
但是异常需要释放,怎么办?
finally就是干这个的
forster 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 thefirstz 的回复:]
C++有智能指针
[/Quote]
智能指针是语言之外的
看来这是c++的缺憾
因为比他高级的都有finally
云瑀 2010-09-09
  • 打赏
  • 举报
回复
Q: 为何C++不提供“finally”结构?
A: 因为C++提供了另一种机制,完全可以取代finally,而且这种机制几乎总要比finally工作得更好:就是——“分配资源即初始化”。(见《The C++ Programming Language》14.4节)基本的想法是,用一个局部对象来封装一个资源,这样一来局部对象的析构函数就可以自动释放资源。这样,程序员就不会“忘记释放资源”了。 [译注:因为C++的对象“生命周期”机制替他记住了 :O) ] 下面是一个例子:
	class File_handle {
FILE* p;
public:
File_handle(const char* n, const char* a)
{ p = fopen(n,a); if (p==0) throw Open_error(errno); }
File_handle(FILE* pp)
{ p = pp; if (p==0) throw Open_error(errno); }

~File_handle() { fclose(p); }

operator FILE*() { return p; }

// ...
};

void f(const char* fn)
{
File_handle f(fn,"rw"); // open fn for reading and writing
// use file through f
}



在一个系统中,每一样资源都需要一个“资源局柄”对象,但我们不必为每一个资源都写一个“finally”语句。在实作的系统中,资源的获取和释放的次数远远多于资源的种类,所以“资源分配即初始化”机制产生的代码要比“finally”机制少。

[译注:Object Pascal,Java,C#等语言都有finally语句块,常用于发生异常时对被分配资源的资源的处理——这意味着有多少次分配资源就有多少finally语句块(少了一个finally就意味着有一些资源分配不是“exception safe”的);而“资源分配即初始化”机制将原本放在finally块中的代码移到了类的析构函数中。我们只需为每一类资源提供一个封装类即可。需代码量孰多孰少?除非你的系统中每一类资源都只被使用一次——这种情况下代码量是相等的;否则永远是前者多于后者 :O) ]
另外,请看看《The C++ Programming Language》附录E中的资源管理例子。
昵称很不好取 2010-09-09
  • 打赏
  • 举报
回复
C++有智能指针

64,637

社区成员

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

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