【C++】异常处理 ③ ( 栈解旋 | 栈解旋概念 | 栈解旋作用 )

文章目录

  • 一、栈解旋
    • 1、栈解旋引入
    • 2、栈解旋概念
    • 3、栈解旋作用
  • 二、代码示例 - 栈解旋
    • 1、代码示例
    • 2、执行结果





一、栈解旋




1、栈解旋引入


C++ 程序 抛出异常后 对 局部变量的处理 : 当 C++ 应用程序 在 运行过程 中发生异常时 , 程序会跳转到异常处理程序 , 并执行一些操作以处理异常 ; 在这个过程中 , C++ 会自动处理函数调用的堆栈 , 并释放局部变量和对象等资源 ;

上述操作就是 " 栈解旋 " ;


2、栈解旋概念


C++ 语言 中的 栈解旋 ( Stack Unwinding ) 是指 在程序发生异常时 , 系统从当前的函数开始逐层返回 , 释放每个函数中的局部变量 , 直到回到主函数 main 函数中 , 同时执行异常处理程序 , 上述完整过程称为 " 栈解旋 " ;


在 try 语句块中 , 在 try 语句块中 被调用的 函数 , 在 函数栈 中分配的 局部变量 , 如果出现异常 , 会将 栈内存 中的所有局部变量 自动析构 ;

抛出异常后 , 从 进入 try 语句块起 , 到 异常被抛出前 , 所有在 函数栈 中创建的对象 或 数据 , 都会被自动析构 , 析构的顺序 与 创建顺序 相反 ;


3、栈解旋作用


" 栈解旋 " 的 作用是确保程序在异常发生时能够安全退出 , 并释放占用的资源 ; 如果不进行栈解旋 , 程序就会崩溃 , 并导致 内存泄漏 等问题 ;





二、代码示例 - 栈解旋




1、代码示例


在下面的 示例中 , 使用 throw 语句抛出异常 , 并在 try-catch 语句块 中捕获并处理异常 ;

在 main 函数中的 try 代码块 中调用 fun 函数 , fun 函数中抛出异常 ;

fun 函数中 , 定义了局部变量 tudent s;

如果在 try 代码块中调用该 fun 函数出现异常 , 会自动释放栈内存中的局部变量 ;


C++ 栈解旋 是一种非常重要的机制 , 它确保程序在异常发生时能够安全退出 , 并释放占用的资源 ;

在编写C++代码时,必须了解和正确使用异常处理机制,以确保程序的稳定性和可靠性。



代码示例 :

#include "iostream"
using namespace std;class Student
{
public:Student() {cout << "调用构造函数" << endl;}~Student() {cout << "调用析构函数" << endl;}
};// 1. 在 函数 中 抛出异常
void fun() {// 定义如下局部变量// 这些局部变量都在栈内存中// 如果在 try 代码块中调用该函数出现异常// 会自动释放栈内存中的局部变量Student s;cout << "开始抛出 char 类型 异常 " << endl;// 抛出一个 char 类型的异常throw 'A';
}int main() {// 2. 捕获并处理异常try{// 调用可能产生异常的函数fun();}// 捕获一切未知类型的异常catch ( ... ){cout << "捕获到未知类型异常 ... "<< endl;}// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

2、执行结果


执行结果 : 执行下面的代码时 , 先调用 fun 函数 , 在 fun 中构造 Student 对象 , 抛出异常后 , 首先进行 栈解旋操作 , 释放 fun 函数中的 Student 对象 , 然后进入 catch 分支处理异常 ;

调用构造函数
开始抛出 char 类型 异常
调用析构函数
捕获到未知类型异常 …
Press any key to continue . . .

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/234943.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

距离向量路由协议——RIP

目录 动态路由动态路由简介为什么需要动态路由动态路由基本原理路由协议的分类 距离向量路由协议RIPv1RIP简介RIPv1的主要特征RIPv1的基本配置RIPv1配置案例被动接口单播更新使用子网地址 RIPv2RIPv2的基本配置RIPv2配置案例 RIPv2的高级配置与RIPv1的兼容性手工路由汇总触发更…

【C++】string模拟

string讲解&#xff1a;【C】String类-CSDN博客 基本框架 #pragma once #include <iostream> using namespace std; ​ namespace wzf {class string{public:// 默认构造函数string(): _str(new char[1]), _size(0), _capacity(0){_str[0] \0; // 在没有内容时仍要有终…

python中的序列

文章目录 序列类型标准类型运算符标准类型运算符序列类型运算符字符串 序列类型 字符串 列表 元组 由元组构成的列表 标准类型运算符 &#xff08;1&#xff09;按字符串大小比较 标准类型运算符 序列类型运算符 序列类型转换内建函数 注&#xff1a; &#xff08;1&#xff…

基于SpringBoot房产销售系统

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了房产销售系统&#xff0c;它彻底改变了过去传统的…

frp 配置内网访问

frp介绍 frp 是一个开源、简洁易用、高性能的内网穿透软件&#xff0c;支持 tcp, udp, http, https 等协议。frp 项目官网是 https://github.com/fatedier/frp 下载地址&#xff1a; https://github.com/fatedier/frp/releases frp工作原理 服务端运行&#xff0c;监听一个…

AI Agents 闭门研讨会报名丨CAMEL、AutoAgents、Humanoid agents作者参与

青源Workshop丨No.27 AI Agents主题闭门研讨会 所谓AI智能体&#xff08;AI Agents&#xff09;&#xff0c;是一种能够感知环境、进行决策和执行动作的智能实体。它们拥有自主性和自适应性&#xff0c;可以依靠AI赋予的能力完成特定任务&#xff0c;并在此过程中不断对自我进行…

【驱动】串口驱动分析(四)-串口编程和调试方法

串口调试 串口调试主要有 根据/proc系统信息确认串口状态&#xff0c;stty命令&#xff0c;编程调试 三种调试方法&#xff0c;下面我们分别具体介绍下。 根据设备节点确认串口是否正常 系统上电时&#xff0c;默认会使能串口&#xff0c;我们可以通过dmesg | grep ttyS 查看…

掌握Python BentoML:构建、部署和管理机器学习模型

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com BentoML是一个开源的Python框架&#xff0c;旨在简化机器学习模型的打包、部署和管理。本文将深入介绍BentoML的功能和用法&#xff0c;提供详细的示例代码和解释&#xff0c;帮助你更好地理解和应用这个强大的工…

JAVA 算法面试总结

1、二分查找 二分查找又叫折半查找&#xff0c;要求待查找的序列有序。每次取中间位置的值与待查关键字比较&#xff0c;如果中间位置 的值比待查关键字大&#xff0c;则在前半部分循环这个查找的过程&#xff0c;如果中间位置的值比待查关键字小&#xff0c; 则在后半部分循环…

公网穿透和RTC

RTC RTC 是 Real-Time Communication 的简写&#xff0c;正如其中文名称 “即时通讯” 的意思一样&#xff0c;RTC 协议被广泛用于各种即时通讯领域&#xff0c;诸如&#xff1a; 在线教育&#xff1b;直播中的主播连麦 PK&#xff1b;日常生活的音视频电话&#xff1b;.....…

iptables防火墙之SNAT与DNET

NAT 1.SNAT&#xff1a;让内网可以访问外网 2.DNAT&#xff1a;让外网可以访问到内网的机器 网关服务器&#xff0c;要开启路由功能 内核功能&#xff1a; sysctl -a 列出所有参数 内核参数&#xff0c;然后grep可以查看到默认的内核参数 内核参数配置文件 /etc/sysctl.…

免费版的水淼采集器下载-水淼采集器详细使用教程

在当今信息爆炸的时代&#xff0c;网络上的数据量庞大&#xff0c;如何高效地采集、整理并利用这些信息成为了许多人关注的问题。水淼采集器作为一种强大的免费工具&#xff0c;在信息搜集的领域扮演着举足轻重的角色。本文将深入探讨水淼采集器的使用以及提供一份简明易懂的教…