c++标准库(笔记):智能指针(1) -- shared_ptr

自c++11起,c++标准库提供了两大类型的智能指针
1、shared_ptr
2、unique_ptr
这两个类被定义在

shared_ptr:当对象再也不被使用时就被清理
创建shared_ptr:
shared_ptr pNico(new string("nico"));
也可以使用make_shared:
shared_ptr pJutta = make_shared("jutta");
还可以先声明再赋值,但不能使用赋值运算符,必须改用reset:
shared_ptr pNico;
pNico.reset(new string("nico"));

shared_ptr可以声明属于自己的Deleter:
shared_ptr pNico(new string("nico"), [](string* p){cout << "delete" << *p
<< endl; delete p;}
pNico = nullptr;
如果在最后一个对象结束后,而清理工作不仅仅是删除内存,则必须明确自己给出的deleter,可
以指定属于自己的析构策略。

std::shared_ptr fp(new std::ofstream("tmpfile.txt"), FileDeleter
("tmpfile.txt"));
FileDeleter是一个函数,当最后一个对象要结束生命的时候,由他删除内存并删除tmpfile.txt
文件

注1:由于接受单一pointer作为唯一实参的构造函数是explicit,所以不能够使用赋值符,那样
的话会被视为需要一个隐式转换。然而新式初始化语法(列表初始化)是被接受的

shared_ptr pNico = new string("nico"); //error
shared_ptr pNico{new string("nico")};  //ok

注2:shared_ptr不提供operator[]以及指针运算,只提供operator*和operator->,因此,想访
问内存,必须使用get()获取被shared_ptr包裹的内部指针:

smp.get()[i];

注3:关于array的应用:
std::shared_ptr p(new int[10]); //error,默认构造器提供的是delete而不是delete[]
可以通过自己定义一个deleter:
std::shared_ptr p(new int[10],[](int* p){delete[]p;});
也可以使用为unique_ptr提供的辅助函数作为deleter:
std::shared_ptr p(new int[10], std::default_delete());

其他的应用:
调用use_count()查看shared pointer所指对象的当前拥有者数量;
 

你可能感兴趣的:(c++标准库)