浅析c++11的智能指针

c++11智能指针

在c+ +11中,引入了智能指针。主要有:unique_ptr,shared_ptr,weak_ptr.
这3种指针组件就是采用了boost里的智能指针方案。我们看一下它和c++11智能指针的功能:

std功能说明
unique_ptr独占指针对象,防拷贝
shared_ptr引用计数,支持拷贝,支持定制删除器
weak_ptr协助shared_ptr

上面三个和auto_ptr都在头文件里

#include<iostream>
#include<memory>
using namespace std;
#include<string>
using namespace std;

int main()
{
    unique_ptr<int>  up1(new int(11));
    //unique_ptr<int> up2 = up1;//编译会出错[1]


    cout << *up1 << endl;
    unique_ptr<int> up3 = move(up1);//[2]

    cout << *up3 << endl;
    if(up1)
        cout << *up1 << endl;

    up3.reset();//[3]
    up1.reset();

    shared_ptr<string> sp1(make_shared<string>("hehe"));

    shared_ptr<string> sp2 = sp1;
    cout <<"*sp1"<< *sp1 << endl;
    cout <<"*sp2"<< *sp2 << endl;

    sp1.reset();
    cout << "*sp2" << *sp2 << endl;

    weak_ptr<string> wp = sp2;//[4]
    cout << "*wp.lock():" << *wp.lock() << endl;
    sp2.reset();
//  cout << "*wp.lock():" << *wp.lock() << endl;//运行时错误


    system("pause");
    return 0;
}

运行结果:

11
11
*sp1hehe
*sp2hehe
*sp2hehe
*wp.lock() :hehe

总结:
1:unique_ptr是禁止赋值赋值的,始终保持一个unique_ptr管理一个对象
2:unique_ptr虽然不能赋值,但可以通过move()函数转移对象所有权,并且之前up1无效
3:reset()方法可以提前释放指针

shared_ptr与weak_ptr

由于shared_ptr使用引用计数,所以有循环计数的问题。为了打破循环,可以使用weak_ptr
,顾名思义,weak_ptr是一个弱引用,只引用,不计数。如果一块内存被shared_ptr与weak_ptr同时引用,当所有shared_ptr析构之后,不管有没有weak_ptr引用,该内存都会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需检查。

示例:

void Test()
{
    shared_ptr<int> sp1(new int(5));
    weak_ptr<int> wp1 = sp1;//还是只有sp1有所有权
    {
        shared_ptr<int> sp2 = wp1.lock();//sp1和sp2都有所有权
        if (sp2)
        {
            cout <<"*sp2"<< *sp2 << endl;
        }
    }//sp2析构了,现在只有sp1有所有权

    sp1.reset();//释放内存
    shared_ptr<int> sp3 = wp1.lock();//因为内存已经被释放了,所以sp3是空指针
    if (sp3)
    {
        cout <<"*sp3"<< *sp3 << endl;
    }
}

总结

智能指针的设计思想就是RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源、避免内存泄露的方法。它保证在任何情况下,使用对象时先构造对象,最后析构对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值