【发布时间】:2015-09-24 02:04:11
【问题描述】:
是否可以制作 jmp_buf 的副本并在以后恢复它?像
jmp_buf oldEnv = env;
int val = setjmp(env);
.......
env = oldEnv;
我使用 memcopy() 和 sizeof(env) 来复制 jmp_buf 数据。这似乎工作正常。这只是巧合吗?
【问题讨论】:
-
longjmp在 C++ 中一开始就无效,您需要使用异常来进行跨函数流控制,因为 C++ 依赖于适当的堆栈展开。setjmp/longjmp可能会在异常情况下实现,但不能保证堆栈展开。标准实际上说的是:“如果将setjmp和longjmp替换为catch和throw,则setjmp/longjmp调用对具有未定义的行为,将为任何自动对象调用任何非平凡的析构函数。 "