文章目录

  • 一、RALL简介
  • 二、RALL机制
  • 三、智能指针的介绍
  • 四、std::unique_ptr的使用

一、RALL简介

RALL是resource acquisition is initialization的缩写,意思是”资源获取即初始化”。它是C++之父Bjarne Stroustrup提出的设计理念,其核心是把资源和对象的声明周期绑定,对象创建获取资源,对象销毁释放资源。在RALL的指导下,C++把底层的资源管理问题提升到了对象声明周期管理的更高层次。

二、RALL机制

  • 使用C++时,最让人头疼的便是内存管理,但却又正是对内存高度可操作性给了C++程序员极大自由和装逼资本。
  • 当我们在堆区new出一块内存空间,在使用完之后,如果不使用delete来释放这块资源则将导致内存泄漏,这在中大型项目中极具有破坏性。但人无完人,我们并不能保证每次都记得释放无法再次获取到且不再使用的内存,下面给出一个例子,让大家看看忘记释放资源造成内存泄漏多么恐怖!!
#include<iostream>
#include<memory>int main()
{for (int i = 0; i <= 10000000; i++){int* ptr = new int(3);ptr[0] = 1;ptr[1] = 2;ptr[2] = 3;//delete ptr    //忘记释放内存}return 0;
}

测试结果(未释放内存):

运行程序并打开资源管理器,可以发现这么简单的程序竟然占用了11点几的MB内存,所以大家千万要记得释放内存。

三、智能指针的介绍

在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存

C++11提供了三种智能指针,使用这三种智能指针需导入memory的头文件。

  • std::shared_ptr:共享智能指针。
  • std::unique_ptr:独占智能指针。
  • std::weak_ptr:弱引用智能指针,它不共享指针,不能操作资源,是用来监视std::shared_ptr的。

四、std::unique_ptr的使用

std::unique_ptr 是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个 unique_ptr 赋值给另一个 unique_ptr

// 通过构造函数初始化对象
unique_ptr<int> ptr1(new int(10));
// error, 不允许将一个unique_ptr赋值给另一个unique_ptr
unique_ptr<int> ptr2 = ptr1;

std::unique_ptr不允许复制,但是可以通过函数返回给其他std::unique_ptr,还可以通过std::move来转移给其他的std::unique_ptr,这样原始指针的所有权就被转移了,这个原始指针还是被独占的。

#include <iostream>
#include <memory>
using namespace std;unique_ptr<int> func()
{return unique_ptr<int>(new int(520));
}int main()
{// 通过构造函数初始化unique_ptr<int> ptr1(new int(10));// 通过转移所有权的方式初始化unique_ptr<int> ptr2 = move(ptr1);unique_ptr<int> ptr3 = func();return 0;
}

unique_ptr的指针类有一个reset方法,函数原型如下:

void reset( pointer ptr = pointer() ) noexcept;

使用reset方法可以让unique_ptr解除对原始内存管理,也可以用来初始化一个独占智能指针。

int main()
{unique_ptr<int> ptr1(new int(10));unique_ptr<int> ptr2 = move(ptr1);ptr1.reset();ptr2.reset(new int(250));return 0;
}
  • ptr1.reset(): 解除对原始内存的管理。
  • ptr2.reset(new int(250)): 重新指定智能指针管理的原始内存。

如果想要获取独占智能指针管理原始地址,可以调用get()方法,函数原型如下:

pointer get() const noexcept;

获取原始地址的测试代码:

#include <iostream>
#include <memory>
using namespace std;int main()
{unique_ptr<int> ptr1(new int(10));unique_ptr<int> ptr2 = move(ptr1);ptr2.reset(new int(250));cout << *ptr2.get() << endl; // 得到内存地址中存储的实际数值 250return 0;
}

测试代码的结果:

RALL原则和unique_ptr相关推荐

  1. C++11智能指针(unique_ptr、shared_ptr、weak_ptr)boost::scoped_ptr

    C++11智能指针(unique_ptr.shared_ptr.weak_ptr)_-码农小非-的专栏-CSDN博客_c++ shared_ptr weak_ptr 原创)智能指针拾遗 (原创)智能指 ...

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

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

  3. RALL 与 智能指针

    文章目录 一.RALL是什么? 二.智能指针 什么是智能指针? (1)shared_ptr: share_ptr初始化的方法: (2)unique_ptr 总结 一.RALL是什么? RALL是一种编 ...

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

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

  5. 智能指针以及rall

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

  6. C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

    目录 1.引言 2.什么是智能指针? 3.在Visual Studio中查看智能指针的源码实现 4.独占式指针unique_ptr 4.1.查看unique_ptr的源码实现片段 4.2.为什么uni ...

  7. 浅谈设计模式六大原则

    文章目录 前言 一.设计模式是什么? 二.设计模式六大原则 1.开闭原则(总原则) 2.单一职责原则 3.依赖倒转原则 4.里氏替换原则 5.接口隔离原则 6.迪米特原则 总结 前言 早就想写一下设计 ...

  8. C++编程原则1 tcy

    1.1.基本原则1)保持简单和直接原则KISS( keep it simple ,stupid)2)不要原则YAGNI(You aren' gonna need it.)确定真的必要时在写代码:以后也 ...

  9. 关于新技术的引入原则 ——从零开始学架构

    不以解决实际问题引入的技术都耍流氓. 新技术的引入不是为了证明自己,而是为了解决实际项目中遇到的问题.希望诸位能够控制住自己的心魔. 新技术的引入要求应该是解决的问题大于带来的问题. 再引入新技术,请 ...

最新文章

  1. Android NDK JNI开发3
  2. 属性项目的定义(property)[ZT]
  3. SQL学习之使用视图
  4. python中functools_functools模块2个常用函数
  5. 爬虫03-url的格式
  6. Android 图片相关整理
  7. 测试代码耗时的时间段(.net)
  8. python cls方法
  9. 微信小程序打开文档功能
  10. 个人价值:个人价值冰山模型
  11. Landsat卫星数据介绍及下载方法
  12. STM32输出PWM波形以及实现LED呼吸灯
  13. win7 计算机桌面图标不见了,win7系统桌面计算机快捷图标不见了的解决方法
  14. 美国参议员建议立法“黑掉国土安全部”
  15. 安装配置Glusterfs
  16. 平台开发——skynet——⑤网关服务gate
  17. “团队奖金包”让年终奖更公平
  18. laravel 链接多库方案
  19. ATMEGA8A-AU代理供应与方案开发
  20. js 直接打开选择文件窗口_基于HTML5 构建的 Web端现代化PDF在线预览插件——PDF.js...

热门文章

  1. 使用NanoHTTPD在Android上建立本地服务器
  2. JavaScript的循环和
  3. 【HGE引擎】源码解析——常用公共函数(二)
  4. 每日计划(2)——大二
  5. 什么是utf8mb4和utf8mb3区别?
  6. Some useful linux commands
  7. Android制作圆形背景
  8. 动态磨砂玻璃渐变背景
  9. 图像去燥——TV Loss
  10. const char*, char const*, char*const的区别