zoukankan      html  css  js  c++  java
  • c++智能指针-unique_ptr

    #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;
    }
    
    
  • 相关阅读:
    Mybatis Interceptor 拦截器原理 源码分析
    Mybatis SqlSessionTemplate 源码解析 原理理解
    DRUID连接池的实用 配置详解以及监控配置
    Oracle 单行函数
    Oracle复杂查询及总结
    Oracle数据更新、事务处理、数据伪列
    Oracle表的创建及管理
    Oracle建表、更新、查询综合练习
    Oracle约束
    Oracle集合、序列
  • 原文地址:https://www.cnblogs.com/lyxf/p/12358300.html
Copyright © 2011-2022 走看看