smart pointer

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());  //指定删除器的类型并且传入一个删除器
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值