setjmp和longjmp很难和C++相处

本文探讨了C++中setjmp和longjmp的使用为何与C++对象语义不兼容,通过示例展示了当longjmp调整栈时,局部对象无法正确析构,可能导致资源泄露和系统问题。文章强调了在longjmp调用的函数作用域内避免定义局部对象的重要性,并指出在特定情况下,理解其工作原理可以确保程序安全性。
摘要由CSDN通过智能技术生成
setjmp和longjmp很难和C++相处

    C程序员唯有以setjmp和longjmp才能近似这样的行为。但是longjmp在C++中有一个严重的缺陷:当它调整栈的时候,无法调用局部对象的destructors。

    这究竟是为什么?大家知道,C++语言中是基本兼容C语言中的语义的。但是为什么,在C++程序中,唯独却不能使用C语言中的异常处理机制?虽然大家都知道,在C++程序中,实际上是没有必要这么做,因为C++语言中提供了更完善的异常处理模型。但是,在许多种特殊情况下,C++语言来开发的应用程序系统中,可能采用了C语言中的异常处理机制。例如说,一个应用程序由于采用C++开发,它里面使用了C++提供的异常处理机制;但是它可能需要调用其它已经由C语言实现的程序库,而恰恰在这个被复用的程序库中,它也采用了异常处理机制。因此对于整个应用程序系统而言,它不可避免地出现了这种矛盾的局面。并且这种情况是非常多见的,也可能是非常危险的。因为毕竟,“setjmp and longjmp do not support C++ object semantics”。所以,我们非常有必要来了解它究竟为什么不会兼容。

  在本篇文章中,主人公阿愚将和程序员朋友们一起,深入探讨setjmp与longjmp机制,为什么它很难与C++和睦相处?另外还有,如果C++语言来开发的应用程序系统中,不得不同时使用这两种异常处理模型时,又如何来尽可能保证程序系统的安全?

C++语言中使用setjmp与longjmp

  闲话少说,还是看例程先吧!代码如下:

// 注意,这是一个C++程序。文件扩展名应该为.cpp或其它等。例如,c++setjmp.cpp
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

//定义一个测试类
class MyTest
{
public:
MyTest ()
{
printf("构造一个MyTest类型的对象\n");
}

virtual ~ MyTest () 
{
printf("析构销毁一个MyTest类型的对象\n");
}
};

jmp_buf mark;

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值