现在的位置: 首页 > 综合 > 正文

智能指针之auto_ptr

2019年06月10日 ⁄ 综合 ⁄ 共 1459字 ⁄ 字号 评论关闭

最近在看STL,看到了auto_ptr,发现这个真的是个好东西,不敢自私,所以写篇博文和大家共享。C++标准程序库提供的auto_ptr是一种智能型的指针(smart pointer)。可以帮助程序员防止一些资源泄漏。

我们都知道在C++中用new开辟的空间是在堆上开辟的。同时,我们还知道用new开辟的空间,必须用delete来释放,必须手动释放。其实就这个动态开辟内存空间,然后又手动释放,这个很纠结的事情就带来了很多纠结的问题。

现在我打个比方:如果你动态开辟的空间,开辟成功了,然后也写了释放语句。这就是按照套路出发。是的,程序是对的,但是,你有没有想过这样的一个问题。

/*
*......
*/
int *p = new int[10];
/*
*.......
*/
delete[] p

如此,无可厚非,但是,问题就是出现在new和delete之间了。你可以想想,你成功的在堆上开辟了空间,程序还没有执行到delete语句的时候,程序抛出了异常,或者各种蛋疼的错误而退出去了。这个时候,你是不是傻眼了,是的,这个问题的确很难解决。既然有了问题,那么肯定又解决问题的方法了,出现异常了,那么我们就可以捕捉异常。如下:

/*
*......
*/
ClassB *b = new ClassB();
try
{
...
}
catch (...) //for any exception
{
delete b;
throw;
}

delete b; //clean up on normal
/*
*......
*/

如此,捕捉各种异常,然后在异常中删除开辟的空间。貌似很完美,是的,程序的冗余度将大大的增加,同时程序的易读性也不好。同时,对于一个大的项目来说,这种方法并不可取。

是的,神一样的STL提供了auto_ptr。多么伟大的东西。防止所谓的“内存泄露”,提供了更好的解决方法。我们知道STL讲究的是泛型。同时这也用到了auto_ptr身上,现在我们来看看auto_ptr的力量。

#include <iostream>
#include <memory>
using namespace std;

template <class T>
ostream& operator<< (ostream& strm, const auto_ptr<T>& p)
{
	if (p.get() == NULL)
	{
		strm<<"NULL";
	}
	else
	{
		strm<<*p;
	}
	return strm;
}

int main()
{
	const auto_ptr<int> p(new int(42));
	const auto_ptr<int> q(new int(0));
	const auto_ptr<int> r;

	cout<<"after initialization:"<<endl;
	cout<<"p: "<<p<<endl;
	cout<<"q: "<<q<<endl;
	cout<<"r: "<<r<<endl;

	*q = *p;
	//*p = -77;
	cout<<"after assigning values: "<<endl;
	cout<<"p: "<<p<<endl;
	cout<<"q: "<<q<<endl;
	cout<<"r: "<<r<<endl;
}


这个是auto_ptr的一个小小的例子(来自:C++标准程序库);我们看到了,我们的确是动态开辟了空间,但是,在程序中,我们是没有发现delete语句的,何也?是的,这就是智能指针。是的,我不能再多讲了,伟大的东西不是一篇博文能讲清楚的。还等什么,你也试一试吧。如果你是刚刚进入IT的,或者即将进入IT的,下面这篇博文也非常适合你。

当程序员,你应该懂的法则

抱歉!评论已关闭.