返回信息流c++在try块里申请了一个栈上的对象,如果抛出异常该对象会自行调用析构函数释放。
c语言使用setjmp/longjmp模拟c++的try/catch,但是longjmp跳回去后拿不到栈上对象了。
这是一条镜像帖。来源:北邮人论坛 / cpp / #85149同步于 2015/1/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C语言longjmp模拟C++异常,能否释放栈对象?
ToumaKazusa
2015/1/13镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
C++的stack unwinding是个挺复杂的事情。需要涉及一些和语言具体实现相关的东西。比如那个"personality function"。
如果只是想用C而不用c++,又想模拟C++的自动析构,可以用类似Java的思路。
Java没有“RAII”,也就是没有“栈上对象自动调用析构函数”这样的说法,而是必须用try {} finally {}这样的结构。
你可以把C++的每个作用域想象成一套try-finally结构。比如
{
ofstream s(....);
...
}
对应的java结构是
try {
OFStream fstr = new OFStream(...)
...
} finally {
fstr.close()
}
每个try-finally都需要一个隐含的“pokemon catch”,就是一个万能的catch,抓住所有的东西。上述代码相当于:
try {
OFStream ofs = new OFStream(...)
...
} catch (Throwable e) {
// Do whatever in "finally".
ofs.close();
// Then re-throw.
throw e;
}
如果变换成这样的结构,就容易使用setjmp/longjmp了。
这本书里有讨论过这个问题,但是忘记讨论到哪个层次了。(而且我也不用C,当小说看的没记住细节
http://www.amazon.com/Interfaces-Implementations-Techniques-Creating-Reusable/dp/0201498413
【 在 iFadeToBlack 的大作中提到: 】
: 这本书里有讨论过这个问题,但是忘记讨论到哪个层次了。(而且我也不用C,当小说看的没记住细节
: http://www.amazon.com/Interfaces-Implementations-Techniques-Creating-Reusable/dp/0201498413
感谢!