RAII和智能指针--C++

一、前言

我们知道,c/c++的内存,对程序员来说,是裸露的,所以可以拿到真实的地址,所以容易造成各种内存问题。比如:

野指针:未初始化或已经被释放的指针;

空指针:指向空地址的指针;

内存泄漏:在使用完动态分配的内存后没有释放(即delete或free);

悬挂指针:指向已经释放内存的指针;

等等......

二、RAII

简介

在认识智能指针前,我们先了解一下RAII,我简单介绍一下,RAII(Resource Acquisition Is Initialization)是由 C++ 之父Bjarne Stroustrup提出的,是一种编程技术,翻译为:资源获取即初始化

它将在使用前获取的资源的生命周期,与对象的生命周期绑定到一起。(这些资源可以是:分配的堆内存、执行线程、打开的套接字、打开的文件、锁定的互斥量、磁盘空间、数据库连接等有限资源)

确保在控制对象的生命周期结束时,按照资源获取的相反顺序释放所有资源。同样的,如果资源获取失败,则按照初始化的相反顺序释放所有已完全构造的成员和基类子对象所获取的资源,它的生命周期由操作系统来管理,无需程序员介入。

利用了核心语言特性(对象生命周期、作用域退出、初始化顺序和堆栈展开),以消除资源泄漏并确保异常安全。

原理

它的原理就是:利用栈上局部变量的自动析构,来保证资源一定会被释放。

我们知道,实例对象时会自动调用构造函数,销毁对象时会自动调用析构函数,这些都是通过编译器来执行的,所以如果资源的释放与对象的构造和析构在一起,就不会出现上述问题。

实现步骤
  • 设计一个类来封装资源(可以是文件,内存,socket,锁等等);
  • 在构造函数中执行资源的初始化,比如申请内存,打开文件,申请锁;
  • 在析构函数中执行销毁操作,比如释放内存,关闭文件,释放锁;
  • 使用时声明一个该类的对象,在函数开始位置,或者类的成员变量;

这里利用RAII思想,实现一个File类。

#include 
#include 
using namespace std;
//RALL思想
class File {
public:
	File(const char *file) {
		m_handle = ifstream(file);
		cout << "文件已打开" &l

你可能感兴趣的:(c++,开发语言)