• c++智能指针-shared_ptr


    #include <iostream>
    #include <memory>
    
    static void interfaceOfSharedPtr();
    
    int main(void) {
    	interfaceOfSharedPtr();
    	return 0;
    }
    
    class Object {
    	public:
    		Object(int id) : m_id(id) { std::cout << "init obj " << m_id << std::endl; };
    		~Object() { std::cout << "bye bye " << m_id << std::endl; }
    		int id() const { return m_id; }
    	private:
    		int m_id = 0;
    };
    //目前c++ 的4种指针
    // auto_ptr  c++98 智能指针,使用了
    // shared_ptr //共享指针
    // unique_ptr //只能由一个使用者使用
    // weaked_ptr //与share_ptr搭配使用
    
    //使用智能指针
    using ObjectPtr = std::shared_ptr<Object>;
    
    
    //作为参数的obj,相当于拷贝了一次,use_count 会+ 1,但当函数结束时候,智能指针析构,use_count会恢复原来的个数
    void print(ObjectPtr obj) {
    	//-------------------------智能指针的成员函数
    	std::cout << "count " << obj.use_count() << " id " << obj->id() << std::endl;
    }
    //以引用方式,不会进行copy, use_count不变
    void printRef(const ObjectPtr &obj) {
    	std::cout << "ref count " << obj.use_count() << "id " << obj->id() << std::endl;
    }
    
    
    static void interfaceOfSharedPtr() {
    	ObjectPtr null;
    	std::cout << "ref count is " << null.use_count() << std::endl;
    
    	//使用智能指针来储存对象的指针
    	ObjectPtr obj (new Object(1));	
    	std::cout << "ref count is " << obj.use_count() << std::endl;
    
    	ObjectPtr obj2(obj);
    	std::cout << "ref count is " << obj2.use_count() << std::endl;
    
    	ObjectPtr obj3 = obj;
    	std::cout << "ref count is " << obj.use_count() << std::endl;
    
    	obj2.reset(); //What dose means of reset ?
    	std::cout << "ref count is " << obj.use_count() << std::endl;
    
    	ObjectPtr obj4;
    	obj3.swap(obj4); //把obj3的管理资源相互交换
    	std::cout << "obj4 ref count is " << obj4.use_count() << std::endl;
    	std::swap(obj3, obj4); //采用另一种方式交换 
    	std::cout << "obj4 ref count is " << obj4.use_count() << std::endl;
    
    	//把智能指针存储的指针传出来
    	auto p = obj.get();
    	if(p) {
    		std::cout << "id is" << p->id() << std::endl;	
    	}
    	if(obj) { //重载了 operator bool
    		std::cout << "p id is " << obj->id() << std::endl; //重载: operator ->
    		std::cout << "ref id is " << (*obj).id() << std::endl; //重载了: operator *
    	}
    	
    	obj4 = nullptr;
    	//----------------------------->obj.use_count() == 1 可能效率比较底一点
    	std::cout << "only one hold ptr " << obj.unique() << std::endl; //判断是否是一个人在使用
    	std::cout << "judge differnt: " << std::endl;
    	std::cout << "use_count: " << obj.use_count() << std::endl;
    	printRef(obj);
    	print(obj);
    	std::cout << "use_count: " << obj.use_count() << std::endl;
    }
    
    void deleterOfObject(Object *obj) {
    	if(obj)
    		std::cout << "delete obj " << obj->id()  << std::endl;
    	delete obj;
    }
    
    void useDeleter() {
    	//当智能指针出了作用域后,析构函数就被调用, 哪怕中途抛出异常
    	ObjectPtr obj(new Object(2), deleterOfObject);
    	ObjectPtr obj2 = obj;
    }
    
    
  • 相关阅读:
    [工作代码]dom4j解析实例
    dom4j解析xml报错:Nested exception: org.xml.sax.SAXParseException: White space is required between the processing instruction target and data.
    小米蓝牙耳机使用说明书
    猎豹浏览器(chrome内核)屏蔽视频广告
    [转载]python的常用代码模板
    [转载]存储过程
    存储过程格式及实例
    springboot(十八):解决跨域问题
    springboot(十八):CORS方式实现跨域
    springboot(十七):过滤器(Filter)和拦截器(Interceptor)
  • 原文地址:https://www.cnblogs.com/lyxf/p/12358272.html
Copyright © 2020-2023  润新知