文章目录

一、RALL是什么?

二、智能指针

什么是智能指针?

(1)shared_ptr:

share_ptr初始化的方法:

(2)unique_ptr

总结



一、RALL是什么?

RALL是一种编程思想,对于一些重要资源(申请的空间,网络连接,互斥量等)我们需要在申请使用后将其释放掉,不然会造成资源的浪费。而RALL就是释放资源的一种方式,利用c++的特性,在构造函数中获取资源,析构函数中释放资源,利用对象控制资源的生存。

例子:

class sem
{
public:sem(){if (sem_init(&m_sem, 0, 0) != 0){throw std::exception();}}sem(int num){if (sem_init(&m_sem, 0, num) != 0){throw std::exception();}}~sem(){sem_destroy(&m_sem);}bool wait(){return sem_wait(&m_sem) == 0;}bool post(){return sem_post(&m_sem) == 0;}private:sem_t m_sem;
};
class locker
{
public:locker(){if (pthread_mutex_init(&m_mutex, NULL) != 0){throw std::exception();}}~locker(){pthread_mutex_destroy(&m_mutex);}bool lock(){return pthread_mutex_lock(&m_mutex) == 0;}bool unlock(){return pthread_mutex_unlock(&m_mutex) == 0;}pthread_mutex_t *get(){return &m_mutex;}private:pthread_mutex_t m_mutex;
};

二、智能指针

什么是智能指针?

利用RALL思想实现对申请空间的自动销毁,通过几个模板函数:unique_ptr,shared_ptr,auto_ptr,weak_ptr来实现。

(1)shared_ptr:

共享的智能指针,允许多个智能指针可以指向同一块资源,并且保证共享的资源只会被释放一次。

原理:内部维护了一个引用计数,当有指针引用空间时计数+1,析构时计数-1,当计数为0则释放资源。

实现:

这里将资源的管理和构造方法分开实现,实现智能指针需要,无参构造,构造函数,拷贝构造,移动构造,拷贝赋值,移动赋值,重构*和=。

代码如下(示例):


#pragma once
#include<iostream>
using namespace std;
template<class T>
class Ref
{int r_count = 0;//当前资源计数T* object = nullptr; //被管理的堆区内存
public:Ref(T *target) :object(target){r_count++;}//引用计数加1inline void increase(){r_count++;}//引用计数减一并且判断是否要释放掉原始堆区内存inline void reduce(){r_count--;  //引用计数减一if (r_count == 0) //如果引用计数减为0释放被管理的堆区内存和自己{delete object;delete this;}}T *get(){return object;}int getCount(){return r_count;}
};
//共享智能指针需要的方法:
/*无参构造,传递指针构造,拷贝构造,移动构造,拷贝赋值,移动赋值reset()替换对象 reset()销毁对象operator*()  operator->()get()获取原始指针use_count 获得引用计数
*/
template<class T>
class Share_ptr
{Ref<T> * ref = nullptr;  //Ref使用模板,定义其指针时需加上模板参数<T>
public:Share_ptr() = default;~Share_ptr(){if (ref) ref->reduce(); //引用计数减一}Share_ptr(T *newP){cout << "---------------------调用构造函数-----------------" << endl;ref = new Ref<T>(newP);  //new申请空间同时调用构造函数,new申请无需指定空间大小()中的要走 前面类型的构造}Share_ptr(const Share_ptr &other){cout << "------------------调用拷贝构造-----------------" << endl;this->ref = other.ref;if(ref) ref->increase(); //引用计数加1}Share_ptr( Share_ptr &&other){cout << "------------------调用移动构造-----------------"<<endl;ref = other.ref;other.ref = nullptr;}Share_ptr& operator=(const Share_ptr &other){cout << "-------------------------调用赋值函数-----------------------"<<endl;if (ref){ref->reduce();}ref = other.ref;if (ref){ref->increase();}return *this;}Share_ptr& operator =(Share_ptr &&other){cout << "--------------------------调用移动赋值------------------------"<<endl;if (ref){ref->reduce();}ref = other.ref;other.ref = nullptr;return *this;}T& operator*(){return *ref->get();}T* operator->(){if (ref){  return ref->get();}}int use_count(){if (ref) return ref->getCount();else return 0;}
};

这里并没有考虑多线程问题,多线程中对引用计数操作需要加锁

注意:使用拷贝构造实则时复制,引用计数会增加,而移动构造不会,他是转让权限。

share_ptr初始化的方法:

1.构造函数初始化:

2.make_shared初始化:

(2)unique_ptr

该指针直接禁用了拷贝,赋值以及移动构造,是一个独占性指针。

总结

RALL是重要的编程思想,利用c++的特性实现自动管理资源,重要应用为智能指针,share_ptr等。

RALL 与 智能指针相关推荐

  1. 【c++基础】第五章 RALL机制与智能指针

    第五章 RALL机制与智能指针 RAII机制 auto_ptr资源所有权转移智能指针 独占智能指针unique_ptr shared_ptr共享智能指针 weak_ptr破环指针 智能指针的问题与解决 ...

  2. 智能指针以及rall

    智能指针,RALL c++中,程序员自己申请的空间需要自己去释放,如果忘记,可能会导致资源的泄露 //c++ auto ptr = new vecotr<int>(); //java // ...

  3. C++ — 智能指针的简单实现以及循环引用问题

    http://blog.csdn.net/dawn_sf/article/details/70168930 智能指针 _________________________________________ ...

  4. 【C++】RAll,裸指针,弃用auto_ptr原因

    文章目录 什么是RAll? 1. RAll的原理: 1.1 资源的获取一般分为三个阶段: 1.2 资源的销毁往往是程序员经常忘掉的环节,所以程序界就想,如何才能让资源自动销毁? 裸指针 什么是裸指针? ...

  5. 智能指针详细解析(智能指针的使用,原理解析)

    本文转自努力的少年博主: https://blog.csdn.net/sjp11/article/details/123899141 目录 一. 智能指针的基本概念 二.  智能指针的定义和使用 三. ...

  6. C++11标准下的智能指针

    智能指针 为什么要提出智能指针的概念?能够解决什么问题?优点是什么? 智能指针的提出主要是解决内存泄漏的问题 那么何为内存泄漏呢? 内存泄漏 内存泄漏并不是物理内存空间的丢失,而是应用程序分配某段内存 ...

  7. bartender一行打印两个二次开发_C++ 智能指针和二叉树:图解层序遍历和逐层打印二叉树...

    作者:apocelipes  链接:https://www.cnblogs.com/apocelipes/p/10758692.html 二叉树是极为常见的数据结构,关于如何遍历其中元素的文章更是数不 ...

  8. 五点讲述C++智能指针的点点滴滴

    (在学习C/C++或者想要学习C/C++可以加我们的学习交流QQ群:712263501群内有相关学习资料) 0.摘要 本文先讲了智能指针存在之前C++面临的窘境,并顺理成章地引出利用RAII技术封装普 ...

  9. 关于 智能指针 的线程安全问题

    先说结论,智能指针都是非线程安全的. 多线程调度智能指针 这里案例使用的是shared_ptr,其他的unique_ptr或者weak_ptr的结果都是类似的,如下多线程调度代码: #include ...

最新文章

  1. 用python实现单例模式_Python单例模式的两种实现方式
  2. executable file and DLL
  3. Mastering Oracle SQL学习笔记(join句法专题第六部份)
  4. OpenGL基础45:光照矫正(下)之Gamma校正
  5. 智能优化算法:未来搜索算法-附代码
  6. mysql社工库搭建教程,分享我的社工库的裤子+sphinx社工库搭建教程
  7. 开发3dMax插件的方法和应用
  8. VUE Router Error matched of undefined
  9. 8255芯片控制发光二极管模拟步进电机汇编实验
  10. 2014联通见习感悟
  11. 【scala】获取当前时间的上一个自然周以及自然周集合;获取当前时间的上一个自然月以及自然月的第一天与最后一天
  12. PTA L1-016 查验身份证(15分)
  13. 关于新款macbook的vscode不能用‘!‘创建模板问题
  14. 小程序开发系列之基础部分-开发工具
  15. 娱乐明星为何纷纷入局元宇宙?
  16. 云栖大会人脸识别闸机【技术亮点篇6】--人脸识别闸机采用活体检测技术
  17. Substance 3D Painter 错误求解
  18. 用Python批量获取唯品会商品数据(附视频教程)
  19. CSS3 过渡特性创建信封效果的联系表单
  20. 杰理的蓝牙芯片的key是什么?以及该如何添加key?杰理key文件原理

热门文章

  1. 13个offer,8家SSP,谈谈秋招经验
  2. grep命令 linux
  3. 机器学习:分类模型大全
  4. DataX数据同步工具使用
  5. Java的三大体系架构
  6. 代码质量保证体系(下)
  7. QT 当窗口过小时发送错误 setGeometry: Unable to set geometry 25*160...Resulting geometry:116*160...
  8. STM32的RTC管脚作为Tamper使用(RTC-TAMPER)
  9. DTMF 编码及解码
  10. 华盛证券软件测试工程师工资,【恒生电子工资】软件测试工程师待遇-看准网...