简介

为了防止我们忘记对一个指针对象的释放, 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 参考实现的更多相关文章

  1. 深入学习c++--智能指针(一) shared_ptr

    1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他 2. shared_ptr: 每添加一次引用 就+1,减少一次引用,就-1:做到指针进行共享 3. unique_ptr: 一个 ...

  2. C++ lambda函数及其用法(转)

    由于接触C++不久,很多东西比较陌生,今天看阿里云OSS的C++ SDK文件下载部分例子,发现有如下lambda表达式用法,故了解一下相关知识 /*获取文件到本地文件*/ GetObjectReque ...

  3. shared_ptr和多线程

    前一篇文章写得实在太挫,重新来一篇. 多线程环境下生命周期的管理 多线程环境下,跨线程对象的生命周期管理会有什么挑战?我们拿生产者消费者模型来讨论这个问题. 实现一个简单的用于生产者消费者模型的队列 ...

  4. shared_ptr 和 unique_ptr

    c++11标准废除乐auto_ptr, C++ 标准库智能指针 使用这些智能指针作为将指针封装为纯旧 C++ 对象 (POCO) 的首选项. unique_ptr 只允许基础指针的一个所有者. 除非你 ...

  5. C++动态内存管理之shared_ptr、unique_ptr

    C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...

  6. auto_ptr,shared_ptr 智能指针的使用

    Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技 ...

  7. (译+原)std::shared_ptr及std::unique_ptr使用数组

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462363.html 参考网址: http://stackoverflow.com/questions ...

  8. shared_ptr智能指针源码剖析

    (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档 (http://www.boost.org/doc/ ...

  9. 简单的shared_ptr实现

    RT,代码参考了STL中shard_ptr的实现,基本原理是引用计数,利用Ref_cnt类来管理内存,在shared_ptr创建时创建,此后shared_ptr仅是在拷贝复制析构的过程中对引用进行修改 ...

  10. stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结

    stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结 1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:voi ...

随机推荐

  1. 你常用哪些工具来分析 JVM 性能?

    常用的 JVM 性能分析工具 JVM 性能分析工具主要用于监控.调试和优化 Java 程序的性能,尤其是在垃圾回收.内存泄漏.线程调度等方面.以下是一些常用的 JVM 性能分析工具: 1. jvisu ...

  2. 一个 CTO 的深度思考

    今天和一些同事聊了一会,以下是我的观点 我的观点,成年人只能筛选,不能培养 在组织中,应该永远向有结果的人看齐.不能当他站出来讲话的时候,大家还要讨论讨论,他虽然拿到结果了,但是他就是有一点点小问题. ...

  3. PHP连MYSQL查询结果中文乱码的完美解决方法

    问题背景:近日接手同事的一个项目(wampserver环境),配置好环境,导库完毕,打开页面一看中文全是问号.打开network看了下请求,请求结果里的中文也一样乱码了.懵逼... 解决方法:打开My ...

  4. [转自洛谷]洛谷KateX公式大全【LateX】

    前言 由于在洛谷,有很多人对于\(\KaTeX\)和\(\LaTeX\)之间的关系并不清楚,导致很多人去搜\(\LaTeX\)的资料,然后发现有许多指令无法在洛谷运行. 但是事实上,\(\KaTeX\ ...

  5. 【翻译】 Processing系列|(三)安卓项目构建

    上上篇:[翻译]Processing系列|(一)简介及使用方法 上一篇:[翻译]Processing系列|(二)安卓模式的安装使用及打包发布 我顺藤摸瓜找到了Github仓库,然后发现人家主要还是用A ...

  6. 鸿蒙Next开发实战教程--银行App

    昨天Mate70的官方预热直接引起网络爆炸,现在预约人数已经两百多万了,大家都这么有米吗 今天跟大家分享一个银行app实战教程. 页面虽然看起来比较复杂,但是仔细分析一下并不难,下面跟大家分享一下本项 ...

  7. CLion打开VS创建的GBK编码格式的项目中文乱码问题的解决方法

    在 CLion 中设置 GBK 编码用于编译代码时,如果输出的 message 乱码,通常是由于控制台编码与代码文件的编码不匹配导致的.以下是解决问题的步骤: 1. 设置文件编码为 GBK 确保你的源 ...

  8. Flutter开发的高效图片压缩工具:让APP更加丝滑

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  9. numpy.ndarray.transpose用法理解

    numpy.ndarray.transpose方法对于高维数组来讲,略微有点不太好理解.下面给出我自己对该方法的理解. 对于一个高维数组,transpose((i,j,k))可以这样理解:选取原数组的 ...

  10. Qt图像处理技术七:轮廓提取

    Qt图像处理技术七:轮廓提取 效果图 原理 图像先二值化让rgb数值相同,只有(0,0,0)或者(255,255,255) 取每个点的周围8个点,如果周围8个点与该点rgb值相同,则需要将该点描黑为( ...