博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL:std::shared_ptr大致原理.
阅读量:6818 次
发布时间:2019-06-26

本文共 2581 字,大约阅读时间需要 8 分钟。

hot3.png

#include 
#include
template
class SharedPtr {public: SharedPtr() = default; explicit SharedPtr(Ty&& value); explicit SharedPtr(const Ty& value); ~SharedPtr(); SharedPtr(const SharedPtr
& other); SharedPtr(SharedPtr
&& other); inline int use_count()noexcept { return *(this->counter); } //notice that: //当对 SharedPtr进行 *(解引用操作)的时候会调用这个先把SharedPtr转为指针. operator Ty*()noexcept; SharedPtr
& operator=(const SharedPtr
& other); SharedPtr
& operator=(SharedPtr
&& other);private: mutable int* counter{ nullptr }; //引用计数. Ty* data{ nullptr }; //存储数据的指针.};template
SharedPtr
::SharedPtr(Ty&& value) :data{ new Ty{std::move(value)} }, counter{ new int{0} }{ ++(*(this->counter));}template
SharedPtr
::SharedPtr(const Ty& value) : data{ new Ty{value} }, counter{ new int{0} }{ ++(*(this->counter));}template
SharedPtr
::SharedPtr(const SharedPtr
& other) :counter{ other.counter }, data{ other.data }{ std::cout << "copy constructor" << std::endl; ++((*this->counter));}template
SharedPtr
::SharedPtr(SharedPtr
&& other) :counter{ other.counter }, data{ std::move(other.data) }{ std::cout << "move-constructor" << std::endl; other.counter = nullptr; other.data = nullptr;}template
SharedPtr
& SharedPtr
::operator=(const SharedPtr
& other){ std::cout << "copy operator=" << std::endl; if (*(this->counter) == 1) { delete this->data; delete this->counter; this->data = nullptr; this->counter = nullptr; }else{ --(*(this->counter)); } ++(*(other.counter)); this->counter = other.counter; this->data = other.data; return *this;}template
SharedPtr
& SharedPtr
::operator=(SharedPtr
&& other){ std::cout << "move operator=" << std::endl; this->counter = other.counter; this->data = std::move(other.data); other.counter = nullptr; other.data = nullptr; return *this;}template
SharedPtr
::operator Ty*()noexcept{ std::cout << "change to ptr" << std::endl; return (this->data);}template
SharedPtr
::~SharedPtr(){ --(*(this->counter)); if (*(this->counter) == 0) { delete this->counter; delete this->data; this->data = nullptr; this->counter = nullptr; }}SharedPtr
func(){ SharedPtr
ptr1{ 10 }; SharedPtr
ptr2 = ptr1; std::cout << ptr1.use_count() << "====" << ptr2.use_count() << std::endl; return ptr2;}int main(){// SharedPtr
ptr{ 20 };// std::cout << *ptr << std::endl; //先调用了 operator Ty*();// std::cout << ptr.use_count() << std::endl; std::cout << func().use_count() << std::endl; return 0;}

 

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/849581

你可能感兴趣的文章
maven阿里云中央仓库
查看>>
15.12.14listbox列表框
查看>>
sql 行转列
查看>>
(转)Python新手写出漂亮的爬虫代码1——从html获取信息
查看>>
配置Nim的默认编译参数 release build并运行
查看>>
图片下载
查看>>
《构建之法》第四章读后感
查看>>
python os.path.dirname()
查看>>
android 解析json数据格式
查看>>
Vs2013 头文件注释
查看>>
****** 六 ******、软设笔记【数据结构】-查找、静态查找表,哈希表
查看>>
[转] fitnesse中的Map处理
查看>>
js - 常用功能方法汇总(updating...)
查看>>
matlab 函数库
查看>>
Django博客功能实现—文章评论的显示
查看>>
Activity里面嵌入Fragment一点小代码
查看>>
C#中//注释和///注释的区别
查看>>
Java 面向对象之构造函数和 this 关键字
查看>>
HTML&JS 随手记
查看>>
Linux设备文件的命名
查看>>