智能指针简述

智能指针的使用场景分析

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都可能会抛异常,让我们处理起来很⿇烦。智能指针放到这样的场景⾥⾯就让问题简单多了。

相关推荐
阿昭L2 小时前
Windows通用的C/C++工程CMakeLists
c语言·c++·windows·makefile·cmake
寻寻觅觅☆2 小时前
东华OJ-基础题-58-素数表(C++)
开发语言·c++·算法
专心搞代码2 小时前
【大模型开发】python基础(二)
开发语言·python
咸鱼2.02 小时前
【java入门到放弃】Session和JWT
java·开发语言
桦02 小时前
【C++复习】:多态
c++
AI成长日志2 小时前
【强化学习专栏】深度拆解:多智能体强化学习核心理论与工程实践
算法
Flying pigs~~2 小时前
基于TF_IDF和Bagging的文本分类全过程
算法·随机森林·机器学习·nlp·文本分类
J2虾虾2 小时前
使用GeoTools把Geojson转换成Shp文件
java·开发语言·geotools
树獭叔叔2 小时前
FFN 激活函数深度解析:从 ReLU 到 SwiGLU 的演进之路
算法·aigc·openai