一.简介
C++ 中动态内存的管理是通过 new 和 delete 来配对使用。但是我们可能存在忘记释放内存的情况,为了更好的托管动态内存,C++11 提供了两种智能指针类型来管理动态对象
shared_ptr 允许多个指针指向同一个对象,weak_ptr 类指向 shared_ptr 所管理的对象
unique_ptr 独占所指向的对象
都定义在 memory 头文件中
shared_ptr<T> p //空智能指针,可以指向类型为T的对象 unique_ptr<T> p p //将p用作一个条件判断,若p指向一个对象,则为true *p //解引用p获得它指向的对象 p->get() //返回p中保存的指针 swap(p, q) //交换p q中的指针 p.swap(q)
Shared_ptr<T> p(q)
Shared_ptr<T> p(q, d)
Shared_ptr<T> p(p2, d)
p.reset()
p.reset(q)
p.reset(q, d)
二.Shared_ptr
shared_ptr 最初实现于 Boost 库中,最后被 C++ 标准委员会收录于 C++11 中
shared_ptr是一种智能指针,作用如同指针,但会用引用计数记录不同的shared_ptr指向同一个对象,一旦对象的引用计数变为0,对象就会自动删除
1.初始化
#include <iostream> using namespace std; int main() { //默认初始化的智能指针保存着一个空指针 shared_ptr<string> p1; if(!p1) cout<<"p1==NULL"<<endl; //初始化 shared_ptr<string> p2(new string); if(p2 && p2->empty()){ *p2 = "helloword" cout<< *p2 <<endl; } //一般的初始化方式 shared_ptr<string> print(new string("normal usage!")); cout<<*print<<endl; //推荐安全的初始化方式 shared_ptr<string> print1 = make_shared<string>("safe uage!") cout<< *pint1 <<endl; }
// 错误初始化方式 shared_ptr<int> pa = new int(1); int* p = new int(32); shared_ptr<int> pp(p); cout<< *pp << endl; delete p; cout<< *pp <<endl;
2.get()
get()返回一个内置指针,指向智能指针的管理对象
#include <iostream> #include <memory> using namespace std; void useShared_ptr(int* p) { cout<< *p <<endl; } void delePointer(int* p) { delete p; } int main(int argc, char* argv[]) { shared_ptr<int> p1 = make_shared<int> (32); // shared_ptr<int> p2(p1.get()) 错误,他们各自有内存的引用计数,不能拷贝过去 useShared_ptr(p1.get()); // delePointer(p1.get()) 错误 return 0; }
3.make_shared<>()
安全分配和使用动态内存的方法是调用 make_shared() 标准库函数,此函数在动态内存中分配一个对象并初始化它,返回此对象的shared_ptr
#include <iostream> using namespace std; int main() { shared_ptr<int> p3 = make_shared<int>(42); cout<< *p3 <<endl; shared_ptr<string> pstr = make_shared<string>("99999"); cout<< *pstr <<endl; shared_ptr<int> pint = make_shared<int>(); cout<< *pint <<endl; auto pau = make_shared<string>("auto"); cout<< *pau <<endl; }