博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
智能指针(理解以及实现)
阅读量:7173 次
发布时间:2019-06-29

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

STL的智能指针的引用计数多线程安全???

参考文章:

智能指针对象可以放在堆上吗?需要放在堆上吗?

简单实现

#include 
using namespace std;template
class SmartPtr{
public: SmartPtr(T *p); ~SmartPtr(); SmartPtr(const SmartPtr
&orig); // 浅拷贝 SmartPtr
& operator=(const SmartPtr
&rhs); // 浅拷贝private: T *ptr; // 将use_count声明成指针是为了方便对其的递增或递减操作 // 这样针对同一块内存的多个智能指针的use_count都指向同一个内存区域,共同影响这个内存的值 // 保证任一个智能指针的消失都会同步给其他智能指针对象,当最后一个智能指针消失时就可以析构管理的内存了 int *use_count;};template
SmartPtr
::SmartPtr(T *p) : ptr(p){ use_count = new int(1);}template
SmartPtr
::~SmartPtr(){ // 只在最后一个对象引用ptr时才释放内存 if (--(*use_count) == 0) { delete ptr; delete use_count; ptr = nullptr; use_count = nullptr; cout << "Destructor is called!" << endl; }}template
SmartPtr
::SmartPtr(const SmartPtr
&orig){ ptr = orig.ptr; use_count = orig.use_count; ++(*use_count); cout << "Copy constructor is called!" << endl;}// 重载等号函数不同于复制构造函数,即等号左边的对象可能已经指向某块内存。// 这样,我们就得先判断左边对象指向的内存已经被引用的次数。如果次数为1,// 表明我们可以释放这块内存;反之则不释放,由其他对象来释放。template
SmartPtr
& SmartPtr
::operator=(const SmartPtr
&rhs){ // 《C++ primer》:“这个赋值操作符在减少左操作数的使用计数之前使rhs的使用计数加1, // 从而防止自身赋值”而导致的提早释放内存 ++(*rhs.use_count); // 将左操作数对象的使用计数减1,若该对象的使用计数减至0,则删除该对象 // 因为左操作数对象可能已经指向某块其他内存 if (--(*use_count) == 0) { delete ptr; delete use_count; cout << "Left side object is deleted!" << endl; } ptr = rhs.ptr; use_count = rhs.use_count; return *this;}复制代码

测试程序

#include 
#include "smartptr.h"using namespace std;int main(){ // Test Constructor and Assignment Operator Overloaded SmartPtr
p1(new int(0)); p1 = p1; // Test Copy Constructor SmartPtr
p2(p1); // Test Assignment Operator Overloaded SmartPtr
p3(new int(1)); p3 = p1; return 0;}复制代码

转载地址:http://hrdzm.baihongyu.com/

你可能感兴趣的文章
window与linux下,php的redis扩展安装
查看>>
VirtualBox虚拟机网络设置
查看>>
Mongodb 之 安全权限控制
查看>>
httpclient发送网络请求
查看>>
可自动切换登录不同系统测试实例
查看>>
jQuery Validate
查看>>
Building IKEv1 and IKEv2 on CentOS 7
查看>>
Zabbix server is not running:zabbix access denied
查看>>
我的友情链接
查看>>
linux下的软硬链接
查看>>
【JAVA的 IO流之FileInputStream和FileOutputStream】
查看>>
远程连接mysql 授权方法详解
查看>>
FreeBSD网络配置
查看>>
@synthesize window=_window; 的理解
查看>>
Greenlet理解要点
查看>>
罗森伯格应邀主讲CDCC百家大讲堂38期
查看>>
How to Install Nextcloud 13 Server on Debian 9
查看>>
[深入理解文件系统之一] IO系统调用
查看>>
Java之implements
查看>>
【资料收集】林内域或者林间域之间的账户、计算机迁移
查看>>