第二种情况,主要就是使用在调用异常抛出的函数的地方。如下面的例子:
//异常抛出的函数,适合使用智能指针。 //软件开发人员: 蔡军生 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库里这些指针,都是针对每一方面特定的解决方案,并不是所有地方都可以统一使用,要熟悉这些智能指针的使用,需要花费一些时间来学习,并练习更多的例子,就可以在不同的情况下,选择更合适的方案,防止更多的错误出现。
作者:caimouse 发表于2013-2-4 21:58:21 原文链接
阅读:61 评论:0 查看评论