C++primer学习:模板编程(3):效率与灵活
来源:互联网 发布:东盟共同体 知乎 编辑:程序博客网 时间:2024/06/06 02:44
shared_ptr与unique_ptr之间的明显不同是它们保存指针的策略,另一个不同是它们允许用户重载默认删除器的方式.
shared_ptr将删除器以指针的方式存储,而unique_ptr则将它作为自己类型的一部分.
[练习]:编写自己的shared_ptr类与unique_ptr类
用fuction可以接受所有的可调用对象.
#include "iostream"#include "DebugDelete.h"#include "functional" template <typename T> class shared_pointer { using Dtype = function<void(T*)>; public: /**********默认构造函数****************/ shared_pointer() = default; /**********接受内置指针的构造函数****************************/ shared_pointer(T* p) :data(p), use(new int(1)),del(nullptr){} /************接受内置指针,以及一个删除器的构造函数******/ shared_pointer(T* p, Dtype d) :data(p), use(new int(1)), del(new Dtype(d)){} /*************拷贝构造函数*****************/ shared_pointer(const shared_pointer& p){ data = p.data; use = p.use; } /**************赋值运算符**************************/ shared_pointer& operator=(const shared_pointer& s){ if (this != &s)//如果不是自赋值 { free(); data = p.data; use = p.use; ++*use;//递增现在的计数 } } /**************定义*************************/ T operator*()const{ return *data; } /*************定义-〉************************/ T* operator->()const{ return & this->operator*(); } /*************析构函数*****************/ ~shared_pointer(){ free(); } /************reset函数**********************/ void reset(T* q, Dtype& d){do_ret(q, &d); } void reset(T* q){ do_ret(q,nullptr); } void reset(){ do_ret(nullptr,nullptr); } /****************定义size()*******************/ size_t size()const { return (*data).size(); } private: void free(){ if (--*use == 0)//引用计数为0 { del ? (*del)(data):delete(data);//释放data所指的内存 delete(use);//释放use所指的int } if (del) delete(del);//如果del指向某个删除器,释放内存 } void do_ret(T* q, Dtype* d) { free(); data = q; del = d; } int *use = nullptr;//指向引用计数的指针 T* data= nullptr;//智能指针保存的普通指针 Dtype* del = nullptr;//del用来保存删除器的信息 }; /************unqiue_ptr的模板************/ template<typename T,typename Dtype = function<void (T*)>> class unique_pointer { public: unique_pointer() = default; explicit unique_pointer(T* p) :data(p){}//应该定义为explicit unique_pointer(T*p, Dtype d) :data(p),del(d){} /************定义移动拷贝操作****************/ unique_pointer(unique_pointer && u) : data(u.data), del(u.del) { u.data = nullptr; } /************定义移动赋值操作*************************************/ unique_pointer& operator=(unique_pointer&& u){ if (this != &u) { free(); data = u.data; del = u.del; u.data = nullptr; } return *this; } /************阻止拷贝和赋值*******************/ unique_pointer(const unique_pointer&) = delete; unique_pointer& operator=(const unique_pointer&) = delete; /************析构函数********************************/ ~unique_pointer(){free(); } /**************reset********************/ void reset(T* q = nullptr){ data = q;} /**************release********************/ T* release(){ auto ret = data; data = nullptr; return ret; } private: void free(){ del(data); } T* data = nullptr;//智能指针保存的指针 Dtype del = DebugDelete();//直接保存实例化的删除器 };
0 0
- C++primer学习:模板编程(3):效率与灵活
- C++primer 阅读笔记-模板与泛型编程(效率与灵活性+)
- C++primer学习:模板编程(4)
- C++primer学习:模板编程(6):模板实参推断和forward的运用与源代码
- lua + c语言 混合编程,灵活+效率
- C++primer学习:模板编程(2):类模板的定义
- 《C++primer(第五版)》学习之路-第十六章:模板与泛型编程
- 《C++Primer》 3.19 模板与泛型编程
- 【c++primer】第十六章:模板与泛型编程
- c++primer要点-模板与泛型编程
- C++Primer---模板与泛型编程(一)
- C++Primer笔记 十六 模板与泛型编程
- C++primer阅读笔记----------模板与泛型编程
- 12.29--C++模板与泛型编程--《C++ Primer》学习
- C++primer阅读笔记-模板与泛型编程(重载与模板)
- C++ Primer 学习笔记_86_模板与泛型编程 -满载与函数模板
- C++primer 阅读笔记-模板与泛型编程(函数模板)
- C++primer 阅读笔记-模板与泛型编程(类模板)
- Mysql错误:ERROR 1205 (HY000): Lock wait timeout exceeded解决办法
- Web安全之语法知识补习
- POJ1486 Sorting Slides (二分图求最大匹配)
- SSH端口转发实现代理服务器
- leetcode系列(60)N-Queens, N-Queens II
- C++primer学习:模板编程(3):效率与灵活
- Javascript 学习 笔记三
- Android Bluetooth Low Energy(Android低功耗蓝牙)
- Undefined symbols for architecture x86_64错误
- 一个iOS应用开发背后的流程
- java <!-- 这是我的第二个程序, Scanner类 -->
- 第十周 项目2 二叉树遍历的递归算法
- mac cocoa笔记
- Eclipse/MyEclipse注释模板和格式化模板的使用