这篇文章将为大家详细讲解有关如何理解Boost库中的scoped_ptr,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
创新互联建站-专业网站定制、快速模板网站建设、高性价比临夏州网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式临夏州网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖临夏州地区。费用合理售后完善,10余年实体公司更值得信赖。
1、VC和VS
VC版并不是标准C++,VS版符合标准C++,其语法相当严格。
缺点:VC和VS都只能释放一个具体类型空间,不能对数组空间进行释放,还有写时拷贝的问题;
所以引发了Boost库的出现来解决此类问题。
2、Boost库
推荐看一下Boost库完全开发指南。
Boost本身是开源库,在C++中的地位举足轻重,第三章内存管理,智能指针;
C++中也提供了智能指针,但是并不能解决所有问题。
smart_ptr库中:new delete的运用不正确,是C++中造成资源获取/释放问题的根源,
3、scoped_ptr(局部智能指针)
(1)、如何使用
scoped_ptr是一个很类似auto_ptr的智能指针,但是scoped_ptr的所有权更加严格,不能转让,一旦scoped_ptr获取了对象的管理权,你就无法再从它那里取回来。
平常的智能指针加上#include
#include#include #include //:在include目录下的boost目录下的smart_ptr.hpp; using namespace std; //打开就是其它智能指针的声明; using namespace boost; //boost库必须引入的命名空间 int main(void){ int *p = new int(10); scoped_ptr ps(p); cout<<*ps< ps1(px); cout< size()< ,指针 }
在库的引入下,确实具有智能指针的特性。必须加上
#include和 using namespace boost;,才具有智能指针的特性。
对比:VC和VS版的拷贝构造,赋值都没问题,
scoped_ptr(局部智能指针),对空间的管理权不能交由其它对象,不能进行拷贝构造和赋值。
4、scoped_ptr的内部实现过程
如何达到拥有权不能转移的目的,拷贝构造和赋值语句声明为私有的,不需要实现。
模拟源码实现如下:
#includeusing namespace std; template class scoped_ptr{ public: scoped_ptr(T *p = 0) : px(p){} ~scoped_ptr(){ delete px; } public: T& operator*()const{ return *px; } T* operator->()const{ return px; } T* get()const{ return px; }/* void reset(T *p = 0){ if(p != px && px){ delete px; } px = p; }*/ //boost库中有一个更好的解决方案 typedef scoped_ptr this_type; void reset(T *p = 0){ this_type(p).swap(*this); //无名临时对象技术 } void swap(scoped_ptr &b){ T *tmp = b.px; b.px = px; px = tmp; } private: //不想让其拥有哪些功能,声明为私有即可。 scoped_ptr(const scoped_ptr &);//声明为私有,外部就无法进行拷贝构造了 scoped_ptr& operator=(const scoped_ptr &);//外部就调不动赋值语句了 void operator==(scoped_ptr const &) const; //对象不具有比较== void operator!=(scoped_ptr const &) const; //对象不具有比较!= T *px; }; class Test{ public: void fun(){ cout<<"This is Test fun()"< ps(p); cout<<*ps< ps1(new Test); ps1->fun(); }
对reset()函数的理解:this_type(p).swap(*this);模型如下:
通过新生成的无名临时变量,将新地址与旧地址交换,在最后脱离函数范围,对象消亡,调用析构函数,释放
原先空间,达到不内存泄漏,并且对新空间进行管理。
缺点:不能对数组空间进行管理。
关于如何理解Boost库中的scoped_ptr就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。