unique_ptr, shared_prt,weak_ptr,make_shared 简单描述及使用

unique_ptr, shared_prt,weak_ptr,make_shared 简单描述及对比

#include <iostream>
#include <string>
#include <vector>
#include <memory>

class test{
    public:
        test(){std::cout<<"test constructor..."<<std::endl;}
        std::string name="test";
        ~test() { std::cout << "test destructor..." << std::endl; }    
};

/*unique_ptr是C++11提供的用于防止内存泄漏的智能指针中的一种实现,
unique_ptr包装一个原始指针,并负责其全部生部周期,独占所指的内存
独占:不能被拷贝及赋值. 但是可以被移动
*/
void test_unique_ptr()
{
    /*创建实例*/
    std::unique_ptr<test> pt(new test());
    /*通过unique_ptr 访问成员*/
    std::cout<<"name:"<<pt->name<<std::endl;

    /*赋值, 出错*/
    //std::unique_ptr<test> pt1 = pt;
    
    /*move, 正常*/
    std::unique_ptr<test> pt1 = std::move(pt);
    std::cout<<"name:"<<pt1->name<<std::endl;
    /*pt 变为空指针*/

    pt1.reset(); /*释放内存*/
    //pt1.reset(new test()); /*释放内存,并绑定新的动态对象*/
}

/*
防止内存泄漏,确保用new动态分配的内存空间在各执行路径被释放,
允许多个shared_ptr对象共同托管一个对象,通过引用计数管理对象,当
对象计数变为0时,自动删除,支持复制与拷贝
*/
void test_shared_ptr()
{
    /*创建,复制操作,及引用计数的变化*/
    std::shared_ptr<test> pt(new test());
    std::cout<<"pt ues count:"<<pt.use_count()<<std::endl;
    std::shared_ptr<test> pt1 = pt;
    std::cout << "pt ues count:" << pt.use_count() << std::endl;
    std::cout << "pt1 ues count:" << pt1.use_count() << std::endl;
    std::cout<<"pt name:"<<pt->name<<std::endl;
    std::cout<<"pt1 name:"<<pt1->name<<std::endl;

    /*reset, 引用计数变化*/
    pt.reset();
    std::cout << "pt ues count:" << pt.use_count() << std::endl;
    std::cout << "pt1 ues count:" << pt1.use_count() << std::endl;
    /*move, 引用计数变化*/
    std::shared_ptr<test> pt2 = std::move(pt1);
    std::cout << "pt1 ues count:" << pt1.use_count() << std::endl;
    std::cout << "pt2 ues count:" << pt2.use_count() << std::endl;
}

/*weak_ptr的引入,是为了解决share_ptr 循环引用问题,
 weak_ptr也是一模块类,但是不能直接用它来定义一个智能指针对象,
 只能配合share_ptr来使用,将share_ptr赋值给weak_ptr,且这样不
 会改变引用计数的值
 成员函数:
 lock: 获取shared_ptr 对象,引用加1
 expired: 检测是否可用
*/

void check_weak_ptr(std::weak_ptr<test> &p)
{
    /*弱引用,有则引用,无则返回null*/
    std::shared_ptr<test> pp = p.lock();
    if(pp == nullptr)
    {
        std::cout<<"invalid."<<std::endl;
    }else{
        std::cout<<"use count:"<<pp.use_count()<<std::endl;
    }
}

void test_weak_ptr()
{
    /*查看引用计数变化*/
    std::shared_ptr<test> pt(new test());
    std::cout<<"pt count:"<<pt.use_count()<<std::endl;
    std::weak_ptr<test> pt1 = pt;
    std::cout<<"pt count:"<<pt.use_count()<<std::endl;
    check_weak_ptr(pt1);

}

/*make_shared: 比较安全的分配函数,一次性分配share_ptr与实例对象的内存
效率较高
*/
void test_make_shared()
{
    std::shared_ptr<test> p = std::make_shared<test>();
    auto p1 = std::make_shared<test>();
}


int main()
{
    test_unique_ptr();
    test_shared_ptr();
    test_weak_ptr();
    test_make_shared();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值