Shared_ptr 参考实现
简介
为了防止我们忘记对一个指针对象的释放, C++11出现了shared_ptr. 我们也可以手动实现一个shared_ptr.
参考
https://blog.csdn.net/yanchenzhi/article/details/107591037
code
主要需要实现 类模板
实现空构造函数, 指向对象的构造函数.
赋值构造函数
函数重载 * =
妙处在 重载 = 的时候, 我们判断了一下如果就是本身直接返回, 如果不是本身, 自己的count和ptr_需要判断一下是否需要析构.
template <typename T>
class Shared_mptr{
private:
int *count; // 计数用
T* ptr_; // 真正指向的对象
public:
Shared_mptr():count(nullptr), ptr_(nullptr){}
Shared_mptr(T *p): count(new int(1)), ptr_(p){} // 赋值构造函数
Shared_mptr(Shared_mptr<T> &other):count(&(++*other.count)), ptr_(other.ptr_){} // 拷贝构造函数
T* operator->() {return ptr_;} // 这个说实话没有用到, 我暂时也不知道怎么用orz
T& operator*() { return *ptr_; } // T operator*() { return *ptr_; } 这样也可以
Shared_mptr<T> & operator=(Shared_mptr<T>& other) { // 重载 =
if(this == &other) {
return *this;
}
++*other.count;
if(this->ptr_ && --*this->count == 0) {
delete ptr_;
delete count;
cout << "delete from =" << endl;
}
this->count = other.count;
this->ptr_ = other.ptr_;
return *this;
}
~Shared_mptr() {
if(this->ptr_ && --*this->count == 0) {
delete ptr_;
delete count;
cout << "delete from ~" << endl;
}
}
int getRef() {
return *count;
}
};
int main() {
Shared_mptr<int> pstr(new int(2));
cout << "pstr: " << pstr.getRef() << " " << *pstr << endl;
Shared_mptr<int> pstr2(pstr);
cout << "pstr: " << pstr.getRef() << " " << *pstr << endl;
cout << "pstr2: " << pstr2.getRef() << " " << *pstr2 << endl;
Shared_mptr<int> pstr3(new int(4));
cout << "pstr3: " << pstr3.getRef() << " " << *pstr3 <<endl;
pstr3 = pstr2;
cout << "pstr:" << pstr.getRef() << " " << *pstr << endl;
cout << "pstr2: " << pstr2.getRef() << " " << *pstr2 << endl;
cout << "pstr3: " << pstr3.getRef() << " " << *pstr3 << endl;
Shared_mptr<int>* pstr4 = &pstr;
int *p = new int(3);
int a = 4;
cout << (*p) << " " << sizeof(p) << " " << sizeof(a) << " " << sizeof(*p)<< endl;
//cout << pstr4->getRef() << " " << endl;
return 0;
}
Shared_ptr 参考实现的更多相关文章
- 深入学习c++--智能指针(一) shared_ptr
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他 2. shared_ptr: 每添加一次引用 就+1,减少一次引用,就-1:做到指针进行共享 3. unique_ptr: 一个 ...
- C++ lambda函数及其用法(转)
由于接触C++不久,很多东西比较陌生,今天看阿里云OSS的C++ SDK文件下载部分例子,发现有如下lambda表达式用法,故了解一下相关知识 /*获取文件到本地文件*/ GetObjectReque ...
- shared_ptr和多线程
前一篇文章写得实在太挫,重新来一篇. 多线程环境下生命周期的管理 多线程环境下,跨线程对象的生命周期管理会有什么挑战?我们拿生产者消费者模型来讨论这个问题. 实现一个简单的用于生产者消费者模型的队列 ...
- shared_ptr 和 unique_ptr
c++11标准废除乐auto_ptr, C++ 标准库智能指针 使用这些智能指针作为将指针封装为纯旧 C++ 对象 (POCO) 的首选项. unique_ptr 只允许基础指针的一个所有者. 除非你 ...
- C++动态内存管理之shared_ptr、unique_ptr
C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...
- auto_ptr,shared_ptr 智能指针的使用
Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技 ...
- (译+原)std::shared_ptr及std::unique_ptr使用数组
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462363.html 参考网址: http://stackoverflow.com/questions ...
- shared_ptr智能指针源码剖析
(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档 (http://www.boost.org/doc/ ...
- 简单的shared_ptr实现
RT,代码参考了STL中shard_ptr的实现,基本原理是引用计数,利用Ref_cnt类来管理内存,在shared_ptr创建时创建,此后shared_ptr仅是在拷贝复制析构的过程中对引用进行修改 ...
- stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结
stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结 1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:voi ...
随机推荐
- CentOS linux 安装openssl(openssl拒绝服务漏洞【CVE-2022-0778】解决)
一.安装 1.下载相关openssl包 下载地址: https://www.openssl.org/source/ 2.将下载好的压缩包放到 /app/server/nginx 路径下(根据自己实际需 ...
- packer 学习笔记
前言 网上有一个老哥用 packer 制作镜像的博客里开篇就提到[1]. Failure is success in progress. -- Albert Einstein 不要害怕失败,在用 pa ...
- 痞子衡嵌入式:聊聊i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常. 我们知道 i.MXRT 系列本身并没有片内非易失 ...
- C#配置系统
读取JSON文件 NuGet两个包:Microsoft.Extensions.Configuration,Mircosoft.Extensions.Configuration.Json. { &quo ...
- 求阶乘末尾0的个数(java)
末尾0的个数 题目描述 输入一个正整数,求n!末尾有多少个0?比如n = 10; n! = 3628800 ,所以答案为2 输入描述 输入为一行,n (1 <= n <= 1000)//输 ...
- 100% 自主可控,Java Solon v3.3.1 发布(国产优秀应用开发基座)
Solon 框架! Solon 是新一代,Java 企业级应用开发框架.从零开始构建(No Java-EE),有灵活的接口规范与开放生态.采用商用友好的 Apache 2.0 开源协议,是" ...
- Github如何创建添加开源许可license
我们点击项目上方的 Add file,选择 creat new file 名称填写 LICENSE, 右侧便会出现按钮 Choose a license template 选择你要的证书,填写 年份 ...
- java返回数据库中层级结构数据的treeListMap写法,以动态菜单为例
说明 1.treeListMap写法,与纯算法版本比起来,treeListMap版的缺点是会查询多次数据库,而纯算法只会查询一次数据库 2.里面有不同角色分配不同的菜单相关代码,注意复制粘贴. 3.可 ...
- 负载均衡原理之一:DNS轮循
DNS轮循是指将相同的域名解析到不同的IP,随机使用其中某台主机的技术,该项技术可以智能的调整网站的访问量到不同服务器上,减轻网站服务器的压力,实现负载匀衡;如果您感觉到单一的主机已经不堪负载你网站日 ...
- 博创Luby使用指南
Luby使用指南 1.开机 通电,当显示在boot界面的时候,长按正方形(深灰色)那个键,即可进入选择程序界面,此时再按一次正方形那个键,即可进入USB连接模式,此时用线将Luby和电脑连接起来. 当 ...