还在苦苦敲代码开发APP?你out啦! 试试积木搭建APP吧~

scoped_ptr 与 auto_ptr 与 shared_ptr 区别总结

来源:个人博客     2016-01-18 10:10:05    人气:     我有话说( 0 人参与)

1.auto_ptr 被复制后,将失去原来所致资源的所有权;2.scoped_ptr永远不能被复制或被赋值!scoped_ptr拥有它所指向的资源的所有权,并永远不会放弃这个所有权;3.shared_ptr 是可以共享所有权的智能指针。

1.auto_ptr 被复制后,将失去原来所致资源的所有权;

2.scoped_ptr永远不能被复制或被赋值!scoped_ptr拥有它所指向的资源的所有权,并永远不会放弃这个所有权;

3.shared_ptr 是可以共享所有权的智能指针。

测试实例如下:

#include "stdafx.h"
//#include "windows.h"
#include <memory>
#include <iostream>

using std::tr1::shared_ptr;

class Foo
{
public:
 Foo()
 {
  std::cout<<"new Foo()"<<std::endl;
  i = 0;
 }
 ~Foo()
 {
  std::cout<<"destroy Foo()"<<std::endl;
 }

 void print()
 {
  std::cout<<"Foo::print"<<std::endl;
 }
 int i;
};


void OutSharePtr(shared_ptr<Foo> &P)
{
 Foo* p = new Foo();
 shared_ptr<Foo> sp1(p);
 std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
 shared_ptr<Foo> sp2(sp1);
 p->print();
 sp2->print();
 std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
  P = sp2;
  std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
}

void InSharePtr(shared_ptr<Foo> &p)
{
 p->i += 100;
 std::cout<<p.use_count()<<"::"<<p.get()<<std::endl;
}

#include <algorithm>
char upCase(char c)
{
 return toupper(c);
}

int _tmain(int argc, _TCHAR* argv[])
{
 shared_ptr<Foo> sp1(new Foo());
 shared_ptr<Foo> sp2(sp1);
 shared_ptr<Foo> sp3;
 sp1->print();
 sp2->print();

 std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
 std::cout<<sp3.use_count()<<"::"<<sp3.get()<<std::endl;

 sp3.swap(sp1);

 std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
 std::cout<<sp3.use_count()<<"::"<<sp3.get()<<std::endl;

 sp3.reset();
 std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
 sp2.reset();
 std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
 sp1.reset();
 std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
 return 0;
}
运行结果截图:

scoped_ptr auto_ptr shared_ptr

本文源自互联网,采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,
版权归原作者,如有问题请联系service@tsingfun.com (编辑:admin)
分享到: