longjmp 使 C++ RAII 失效
2022-04-22 11:05
926 查看
C 语言的
longjmp没有进行栈展开,而是直接跳转。从
longjmp到
setjmp之间的所有析构函数都没有调用,也就是
RAII失效。
#include <setjmp.h> #include <iostream> jmp_buf buf; class A { public: A(int x) : x(x) {} ~A() { std::cout << "~A x=" << x << std::endl; } private: int x; }; void f1(), f2(), f3(); void f1() { A a(1); if (setjmp(buf) == 0) { f2(); } } void f2() { A a(2); f3(); } void f3() { A a(3); longjmp(buf, 1); } int main() { A a(0); f1(); }
这段代码输出
~A x=1 ~A x=0
相关文章推荐
- 【C++builder delphi project rule not found 解决方法 】【注册表 DeleteKey 失效 问题】
- C++ vector 迭代器失效原因
- C++之RAII惯用法
- RAII惯用法:C++资源管理的利器
- C++ STL 迭代器失效问题
- C++的营养——RAII 转自 longshanks
- C++ —— RAII编程思想
- RAII惯用法:C++资源管理的利器
- [C++] STL迭代器失效
- C++学习之deque底层存储结构与迭代器失效情况
- RAII and smart pointers in C++ from stackflow
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
- C++营养(RAII)(转)
- C++复习之迭代器失效的问题
- c++迭代器失效2
- C++ —— RAII编程思想
- C++中的RAII技法
- C++的RAII和智能指针小结
- C++中容器迭代器删除失效问题
- c++迭代器失效