c++ smart pointer常用三种:unique_ptr ,shared_ptr, weak_ptr
所谓智能指针,能够自己管理动态内存,自动释放已经不适用的动态内存。
unique_ptr 以独占的方式使用某块内存,常用的类成员函数自己查看API文档,对于动态数组的管理有普通动态成员越有不同,在创建一个unique_ptr变量时需要自己传入一个删除器。
shared_ptr 共享一块动态内存,可以多个shared_ptr 指针指向一个动态内存,对于shared_ptr与动态数组的关系也是一样,需要单独传入一个删除器,在构造函数中传入一个删除器。shared_ptr实际上内部维护一个引用计数,当引用计数变为0的时候,自动释放相应的内存。
weak_ptr指针是为了解决shared_ptr指针之间相互指向,造成的死锁问题,weak_ptr指针指向shared_ptr指针指向的内容,但是并不增加shared_ptr的引用计数,如果要通过weak_ptr使用指向内存,使用lock()方法即可。
简单的使用例子:
#include<iostream>
#include<utility>
#include<string>
#include<ostream>
#include<sstream>
#include<fstream>
#include<forward_list>
#include<set>
#include<memory>
using namespace std;
class A
{
public:
A(){cout << "constructor" << endl;}
~A(){cout << "destructor" << endl;}
};
void delete1(A* p)
{
delete [] p;
}
//函数对象
class Delete
{
public:
void operator()(A* p)
{
cout << "operator()" << endl;
delete [] p;
}
};
int main()
{
shared_ptr<int> p1 = make_shared<int>(1);
cout << *p1 << endl;
shared_ptr<int> p2 = p1;
cout << "use_count:" << p2.use_count() << endl;
*p2 = 10;
cout << "p1: " << *p1 << endl;
p2.reset(new int(11));
cout << "count " << p1.use_count() << endl;
shared_ptr<A> p3(new A[5], delete1);
shared_ptr<A> p4(new A[2], [](A* p){delete [] p;});
Delete d;
shared_ptr<A> p5(new A[3], d);
unique_ptr<int> u1(new int(12));
cout << "u1:" << *u1 << endl;
unique_ptr<int> u2;
u2 = move(u1);
cout << "u2:" << *u2 << endl;
int *u3 = u2.release();
cout << "u3:" << *u3 << endl;
//unique_ptr<A, delete1> u4(new A[2], delete1); 错误的写法
unique_ptr<A, Delete> u4(new A[2], Delete()); //指定删除器的类型并且传入一个删除器
}