您的位置:首页 > 运维架构

boost库在工作(6)作用域智能指针scoped_ptr之五

2013-02-05 20:58 453 查看
通过前面智能指针的学习,应了解到std::auto_ptr的使用和局限性,从而引发boost库针对这些情况提供了更多的智能指针,其中scoped_ptr就是针对std::auto_ptr的而提供的。对开发人员来说,代码限制得越精确,编译器发现尽可能多的错误,就是越好的方式。比如想要某个变量不能改变它的值,就需要常量限定符,这样就可以杜绝任何不小心对变量的操作。在普通的指针里,也常常使用const来限定指针不能指向别的指针。如果需要一个指针既不能指向别的指针,又可以自动删除的智能指针,这样怎么办呢?可以使用下面的方案来解决吗?代码如下:

const std::auto_ptr< int > pTemp1(new int);

这样指针pTemp1常量的,不能指向别的指针,也是一个智能指针。通过这样的方案是可以解决的,但解决起来不是很优美,比如需要写const,导致输入比较长;也没有灵活性,比如又想更换智能指针指向情况,这种方法就不行了。

那还有没有更好的解决方案呢?当然是有的,就是使用scoped_ptr,它是作用域指针,并且不能被拷贝、被赋值,但可以通过函数reset来重新指向新的指针。scoped_ptr与std::auto_ptr的主要区别,就是保存的指针是否可以转移控制权。std::auto_ptr是支持转移控制权,而scoped_ptr不支持。当你编写代码时,不想别人拿走你的指针,就可以使用scoped_ptr来实现,保证只有一个指针指向分配的内存,同时也不让别的指针把它覆盖了。当你在一个类里声明一个指针,又在构造函数之前初始化列表里分配了内存,但在构造函数里又抛出一个异常,这样就会导致内存泄漏,这时需要使用scoped_ptr来解决,如下例子:

//
class CScopedTest
{
public:
CScopedTest()
:m_pTest(new int) //如果这里不使用智能指针,可能会有内存泄漏。
{
//这里可能异常抛出。
}
private:
boost::scoped_ptr< int > m_pTest;
};


scoped_ptr具体使用的例子如下:

//使用scoped_ptr
//软件开发人员: 蔡军生  2013-02-03
void TestScopedPtr(void)
{
//定义变量
boost::scoped_ptr< int > pVal(new int);
if (pVal)
{
*pVal = 1000;
}

std::cout<< *pVal << std::endl;

//下面这行赋值编译会出错。
//boost::scoped_ptr< int > pTemp = pVal;

boost::scoped_ptr< int > pTemp;
//下面这行判断编译会出错
//if (pTemp == pVal)
//{
//}

//这行与boost::scoped_ptr类似
const std::auto_ptr< int > pTemp1(new int);

//重置指针。
pVal.reset(new int);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: