智能指针简述

智能指针的使用场景分析

cpp 复制代码
double Divide(int a, int b)
{
	// 当b == 0时抛出异常
	if (b == 0)
	{
		throw "Divide by zero condition!";
	}
	else
	{
		return (double)a / (double)b;
	}
}
void Func()
{
	// 这⾥可以看到如果发⽣除0错误抛出异常,另外下⾯的array和array2没有得到释放。
	// 所以这⾥捕获异常后并不处理异常,异常还是交给外⾯处理,这⾥捕获了再重新抛出去。
	// 但是如果array2new的时候抛异常呢,就还需要套⼀层捕获释放逻辑,这⾥更好解决⽅案
	// 是智能指针,否则代码太戳了
	int* array1 = new int[10];
	int* array2 = new int[10];   // 抛异常呢
 
	try
	{
	int len, time;
	cin >> len >> time;
	cout << Divide(len, time) << endl;
	}
	catch (...)
	{
	cout << "delete []" << array1 << endl;
	cout << "delete []" << array2 << endl;
            delete[] array1;
            delete[] array2;
            throw; // 异常重新抛出,捕获到什么抛出什么
 
    }

    cout << "delete []" << array1 << endl;
    delete[] array1;
    cout << "delete []" << array2 << endl;
    delete[] array2;
}
int main()
{
    try
    {
			Func();
    }
    catch (const char* errmsg)
    {
			cout << errmsg << endl;
    }
    catch (const exception& e)
    {
			cout << e.what() << endl;
    }
    catch (...)
    {
			cout << "未知异常" << endl;
    }
    return 0;
}

从上面的程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后⾯的delete没有得到执⾏,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete内存,再把异常抛出,但是因为new本⾝也可能抛异常,连续的两个new和下⾯的Divide都可能会抛异常,让我们处理起来很⿇烦。智能指针放到这样的场景⾥⾯就让问题简单多了。

相关推荐
糯米团子7498 分钟前
javascript高频知识点
开发语言·前端·javascript
散峰而望13 分钟前
【算法练习】算法练习精选:陶陶摘苹果(基础+升级)、Music Notes、字串变换,你能AC几道?
数据结构·c++·算法·leetcode·贪心算法·github·动态规划
誰能久伴不乏14 分钟前
libmodbus 在 Windows 环境下报 “Invalid argument“ 的排错记录
c++·qt·modbus
暗夜猎手-大魔王19 分钟前
转载--Hermes Agent 04 | Agent 主循环:一次对话背后发生了什么
人工智能·python·算法
Wonderful U22 分钟前
基于Python+Django的在线题库与智能阅卷系统:从痛点分析到完整实现
开发语言·python·django
码语智行23 分钟前
拦截器、接口限流、过滤器、防重发/幂等性功能说明
开发语言·网络·python
liulilittle26 分钟前
麻将牌堆渲染(Lua)
开发语言·lua
雨落在了我的手上36 分钟前
初始java(十七):常⽤⼯具类介绍
java·开发语言
手写码匠43 分钟前
华为云Flexus+DeepSeek征文|基于华为云Flexus X实例 + Dify + DeepSeek 构建企业级智能知识库问答系统实战
人工智能·深度学习·算法·aigc
凤凰院凶涛QAQ1 小时前
《Java版数据结构 & 集合类剖析》集合框架的封装设计与顺序表:“从 Iterable 到 ArrayList:集合框架的‘职业树“
java·开发语言·数据结构