weak_ptr,shared_ptr,scoped_ptr

scoped_ptr是不能和 weak_ptr,shared_ptr进行转换的,因为没有相应的转换函数!

所以他是孤立,这点从他的名字上也可以见到。scope:作用地域,领域。来开了就没有了。同时在领域内所有权又独占!!

shared_ptr:可以把weak_ptr转化成(赋值给)shared_ptr:而且这种赋值不会导致weak_ptr的引用计数增加。 而仅仅是把weak_ptr的引用计数赋给shared_ptr的引用计数。

也可以把shared_ptr转化成(赋值给)weak_ptr。而且这种赋值不会导致shared_ptr的引用计数增加。 而仅仅是把shared_ptr的引用计数赋给weak_ptr的引用计数。

shared_ptr<int> pi1(new int910));

int *p1=pi1.get();

pi1=p1;//error..

weak_ptr<int>  wp=weak_ptr<int>( pi1.get() );

pi1 = wp;//ok

认识weak_ptr的好方法就是认为 他和一般的指针没有区别,还有就是他没有删除它能访问的动态分配的空间的能力。它存在的目的是 他让 pi1 = wp;//ok 可以进行。

因为在智能指针领域内:

智能指针<Type> 指向Type的智能指针对象 ;

Type * p= new Type;

指向Type的智能指针对象 = p 是错误的!

综上:shared_ptr ,和 weak_ptr对象可以互相赋值。scoped_ptr是孤立的!

weak_ptr无权释放他能访问的动态分配的空间。

所以:

main(){ weak_ptr<int> wp(new int(10) );}将会导致内存泄露

main()

{                      weak_ptr<int> wp(new int(10) );

                       shared_ptr<int> sp=wp;//不会改变引用计数

}//不会有内存泄露

//关于什么情况下转换可以进行可以参看boot源代码。

以上的东西。是我看了网站上的文章和阅读了几分钟的代码得到的。应该有地方不正确,如果您发现了请给我留言

你可能感兴趣的:(weak_ptr,shared_ptr,scoped_ptr)