这篇讲的不错:

http://blog.csdn.net/smstong/article/details/50728022

首先Active Record

然后EBP,ESP等指针

2 通过setjmp和longjmp操纵AR,完成任意跳转

setjmp/longjmp主要从嵌套的函数调用中跳出来。

#include <stdio.h>
#include <setjmp.h> jmp_buf jb;
void a();
void b();
void c(); int main()
{
if(setjmp(jb)==){
a();
}
printf("after a(); \n");
return ;
}
void a()
{
b();
printf("a() is called\n");
}
void b()
{
c();
printf("b() is called\n");
}
void c()
{
printf("c() is called\n");
longjmp(jb, );
}

3 C语言中模拟异常处理

为了统一处理错误,C++,C#,Java等现代语言引入了异常处理机制。C里面模拟异常的代码大概如下:
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h> jmp_buf jb; void f1()
{
printf("进入f1()\n");
if(/*正确执行*/){ }
else {
longjmp(jb,);
}
printf("退出f1()\n");
}
void f2()
{
printf("进入f2()\n");
if(/*正确执行*/) { }
else {
longjmp(jb, );
}
printf("退出f2()\n");
} int main()
{
int r = setjmp(jb);
if(r==){
f1();
f2();
}else if(r==){
printf("处理错误1\n");
exit();
}else if(r==){
printf("处理错误2\n");
exit();
}
return ;
}
可以推测,
  • throw要负责两件事情:(1)完成跳转;(2)恢复堆栈AR;
  • try则负责保存当前AR

4 不要在C++中使用setjmp和longjmp

因为,longjmp的时候,不保证局部对象析构函数的调用。

longjmp()跳转前局部对象可能并不会析构(g++),也可能析构(VC++),C++标准对此并无明确要求。这种依赖于具体编译器版本的代码是应该避免的。

而C++本身的throw关键字,却能严格保证局部对象构造和析构的成对调用。

5 辩证看待异常处理

已经存在大量没有严格使用异常处理C++函数库和类库,兼容的C库更是没有异常的概念,历史的包袱让C++很难完全采用异常处理。在这个方面,Java和C#从头开始,重要的库都实现了标准的异常处理规范,完全采用异常机制切实可行。

有趣的是C++11在标准中删除了异常规范,而且添加了 noexcept关键字来声明一个函数不会抛出异常,可见异常并不是那么受欢迎。

然而,C++的STL广泛使用异常,所以实际上使用了STL的C++程序是不可能禁用异常的,要是没有了STL,C++又有什么优势了呢?C++在不断的矛盾冲突中向前发展者。

C++异常实现与longjmp, setjmp,栈指针EBP, Active Record的更多相关文章

  1. longjmp setjmp and volatile

    /******************************************************************************* * 版权所有: * 模 块 名: * ...

  2. 异常:getHibernateFlushMode is not valid without active transaction; nested exception is org.hibernate.HibernateException: getHibernateFlushMode is not valid without active transaction getHibernateFlu

    场景: 在使用spring整合hibernate调用的HibernateTemplate时报错解决: 在spring配置文件中添加事务的配置 <bean id="hibernateTr ...

  3. Ruby Rails学习中:User 模型,验证用户数据

    用户建模 一. User 模型 实现用户注册功能的第一步是,创建一个数据结构,用于存取用户的信息. 在 Rails 中,数据模型的默认数据结构叫模型(model,MVC 中的 M).Rails 为解决 ...

  4. setjmp和longjmp函数使用详解

    源地址:http://blog.csdn.net/zhuanshenweiliu/article/details/41961975 非局部跳转语句---setjmp和longjmp函数.非局部指的是, ...

  5. C语言中setjmp与longjmp学习笔记

    C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include<setjmp.h> 原型:  int setjmp(jmp_buf envbuf) ,然而longjm ...

  6. (C)非局部跳转语句(setjmp和longjmp)

    1. 特点 非goto语句在函数内实施跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一语句. 头文件包含#include Void longjmp(jmp_buf env,int val ...

  7. C++异常(exception)第一篇--综合讲解

    摘要:catch(exception &ex)是捕获所有标准库定义中的类std:exception;catch(...)则是捕获所有的异常. 1.简介 异常是由语言提供的运行时刻错误处理的一种 ...

  8. 一对一关联关系基于主键映射的异常 IdentifierGenerationException

    具体异常:org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one pro ...

  9. C++基础_总结

    (1)多态性都有哪些?(静态和动态,然后分别叙述了一下虚函数和函数重载) 多态分为两种:静态和动态.静态主要包括函数重载和模板:动态主要是依靠虚函数实现的. 静态联编:重载函数不加virtual关键字 ...

随机推荐

  1. Python对象引用的所有权

    目录 引用所有权 传递引用的所有权--返回值 出借引用的所有权--返回值 占据引用的所有权--参数 出借引用的所有权--参数 引用所有权 谁持有对象引用的所有权,谁就要对对象负责. 引用的所有权对函数 ...

  2. docker常用命令,学习笔记

    - 常用命令 https://docs.docker.com images > docker images # 查看本地镜像 > docker images -a # 查看所(含中间镜像层 ...

  3. Android SDK Manager代理设置

    1.SDK Manager中打开 Tools—>Manage Add-on Sites…—>User Defined Sites 2.New …输入: http://android-mir ...

  4. C++ priority_queue的使用 & Java PriorityQueue

    刚刚那道BST的题目,也用到了priority_queue,那是那个没有定义比较函数. 那么下面这个,就要定义比较函数. 它的模板声明带有三个参数,priority_queue<Type, Co ...

  5. Metasploit - Tips for Evading Anti-Virus

    绕过杀毒软件,有很多钟方法.此处介绍一种,编写python程序调用shellcode,并使用Pyinstaler将python程序编译为exe程序. 准备工作:(Windows XP环境下编译) 将P ...

  6. Python爬虫爬取一篇韩寒新浪博客

    网上看到大神对Python爬虫爬到非常多实用的信息,认为非常厉害.突然对想学Python爬虫,尽管自己没学过Python.但在网上找了一些资料看了一下,看到爬取韩寒新浪博客的视频.共三集,第一节讲爬取 ...

  7. linux log日志解析

    linux log日志解析   其实,可以说成是监控系统的记录,系统一举一动基本会记录下来.这样由于信息非常全面很重要,通常只有 root 可以进行视察!通过登录文件(日志文件)可以根据屏幕上面的错误 ...

  8. BZOJ 3196 线段树套平衡树

    (代码无比丑陋) //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int ...

  9. Linux下网络服务的安全设置

    Linux下网络服务的安全设置      Linux操作系统由于其良好的稳定性.健壮性.高效性和安全性.正在成为各种网络服务的理想平台.各种网络应用在Linux系统上部有性能卓越的应用,例如,提供We ...

  10. android 客户端 Cookie处理

    Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). Cookie最早是网景公司的前雇员Lou Montul ...