boost库在工作(5)作用域智能指针scoped_ptr之四

第二种情况,主要就是使用在调用异常抛出的函数的地方。如下面的例子:

//异常抛出的函数,适合使用智能指针。
//软件开发人员: 蔡军生  2013-02-03
void ThrowFun(void)
{
	if (1)
	{
		throw "Test Throw!";
	}	
}

void TestCallThrow(void)
{
	std::auto_ptr< int > nVal(new int);

	ThrowFun();//这里抛出异常,分配的内存自动删除。

	*nVal = 1000;
}

在这个例子里,当函数TestCallThrow调用一个有异常抛出函数ThrowFun时,如果没有使用智能指针,就比较麻烦了,那么就必须先捕捉这个异常输出,在异常里再添加一个删除内存的操作。如果调用函数比较多,层次比较多,就需要更多的捕捉异常了,这样导致代码也比较难理解,容易出错。

在异常处理里,智能指针作为一个安全释放资源的一种手段,只有采用这种手段才可以更清晰、更可靠。

 

当然使用智能指针std::auto_ptr也有一些要注意的地方:

第一、不能同时让两个std::auto_ptr指针指向同一个对象,如果两个std::auto_ptr指针赋值时,就会把所有权指向另一个指针。

void TestAssign(void)
{
	std::auto_ptr< int > nVal(new int);
	std::auto_ptr< int > pVal = nVal;
	*pVal = 100;
}

在这个函数里,nVal指针会为空,而把内存指针转向pVal指针。这就是所谓的控制权转移的特性。

第二、std::auto_ptr智能指针不能使用在数组指针,因为它不能区分是一般指针,还是数组指针。

第三、std::auto_ptr智能指针不能容器对象。因为容器对象赋值或拷贝的动作,就会导致指针的丢失。

第四、std::auto_ptr智能指针只是简单智能指针,有很多种情况并不适合。因此,就需要引入更加复杂的智能指针,比如boost库里的scoped_ptr、scoped_array、shared_ptr、shared_array、intrusive_ptr、weak_ptr等指针。boost库里这些指针,都是针对每一方面特定的解决方案,并不是所有地方都可以统一使用,要熟悉这些智能指针的使用,需要花费一些时间来学习,并练习更多的例子,就可以在不同的情况下,选择更合适的方案,防止更多的错误出现。

你可能感兴趣的:(boost库在工作(5)作用域智能指针scoped_ptr之四)