码迷,mamicode.com
首页 > 编程语言 > 详细

c++智能指针-unique_ptr

时间:2020-02-24 20:24:28      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:let   int   直接   print   uniq   cas   拷贝构造   from   auto   

#include <iostream>
#include <memory>
#include <cassert>

class Object;

typedef std::unique_ptr<Object> UniqueObjectPtr;
using ObjectPtr = std::shared_ptr<Object>;

void print(const UniqueObjectPtr& obj) {}

class Object {
    public:
        Object(int x) : m_id(x) { std::cout << "Hello Obj" << std::endl; };
        ~Object() { std::cout << "Bye Obj" << std::endl; };
        int id() { return m_id; }
    private:    
        int m_id = 0;

};
void transfer(UniqueObjectPtr obj) {
    std::cout << obj->id() << std::endl;
}

void uniquePtr() {
    UniqueObjectPtr obj { new Object(1) };
    auto p = obj.get(); //operator bool
    if(p) {
        //do some   
    }
    //better
    if(obj) {
                
    }
    
    std::cout << p->id() << " " << obj->id() << " " << (*obj).id() << " " << std::endl;
    print(obj);
    
    p = obj.release(); //释放所管理的指针
    std::cout << "release: unique_ptr" << std::endl;
    delete p; //直接释放资源

    obj.reset(new Object(2)); //reset 就是将以前所管理的指针释放掉, 管理一个新的指针
    //UniqueObjectPtr (const UniqueObject&) = delete //这种拷贝构造函数不存在
    //UniqueObjectPtr (const UniqueObject&&) = default //
    transfer(std::move(obj)); //采用这种方式传入, 则自己的资源不在管理,而交给了这个参数
    //传入之后, obj 值为null

    assert(obj == nullptr);
//  std::cout << obj->id() << std::endl;

    obj.reset(new Object(3));
    ObjectPtr sharedObj(std::move(obj));
    assert(obj == nullptr);
//boost库
/*
    c++ 智能指针来源于boost库.
    shared_ptr
    weak_ptr
    enable_shared_from_this
    scoped_ptr //与unique_ptr 很类似, 但局限性比较多, 所以c++11没有采用
    unique_ptr
 */
}

int main(void) {
    uniquePtr();
    return 0;
}

c++智能指针-unique_ptr

标签:let   int   直接   print   uniq   cas   拷贝构造   from   auto   

原文地址:https://www.cnblogs.com/lyxf/p/12358300.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!