前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】异常处理 ③ ( 栈解旋 | 栈解旋概念 | 栈解旋作用 )

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

作者头像
韩曙亮
发布2023-12-01 09:36:08
2500
发布2023-12-01 09:36:08
举报
文章被收录于专栏:韩曙亮的移动开发专栏

一、栈解旋

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++代码时,必须了解和正确使用异常处理机制,以确保程序的稳定性和可靠性。

代码示例 :

代码语言:javascript
复制
#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 . . .

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、栈解旋
    • 1、栈解旋引入
      • 2、栈解旋概念
        • 3、栈解旋作用
        • 二、代码示例 - 栈解旋
          • 1、代码示例
            • 2、执行结果
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档