首页 > 编程语言 >C++| 1-RAII

C++| 1-RAII

时间:2022-12-20 18:12:47浏览次数:47  
标签:RAII wrapper shape C++ ptr 内存

 

RAII,完整的英文是 Resource Acquisition Is Initialization,是 C++ 所特有的资源管理 方式。

RAII 依托栈和析构函数,来对所有的资源——包括堆内存在内——进行管理。对 RAII 的 使用,使得 C++ 不需要类似于 Java 那样的垃圾收集方法,也能有效地对内存进行管理。

RAII 的存在,也是垃圾收集虽然理论上可以在 C++ 使用,但从来没有真正流行过的主要原因。

内存泄漏

事实说明,漏掉 delete 是一种常见的情况,这叫“内存泄漏” 。   代码例子。

void foo()
{
    bar* ptr = new bar();
    …
    delete ptr;
}

 

两个问题:

1. 中间省略的代码部分也许会抛出异常,导致最后的 delete ptr 得不到执行。

2. 更重要的,这个代码不符合 C++ 的惯用法。在 C++ 里,这种情况下有 99% 的可能性 不应该使用堆内存分配,而应使用栈内存分配。

RAII

对象没办法只能存在堆上的情况, 应当在外面套一个栈实体对象,并利用该实体退出作用域时调用栈中析构函数的行为,去自动清除申请的引用对象。

class shape_wrapper {
public:
  explicit shape_wrapper(
    shape* ptr = nullptr)
    : ptr_(ptr) {}
  ~shape_wrapper()
  {
     delete ptr_;
  }
  shape* get() const { return ptr_; }
private:
  shape* ptr_;
};
void foo()
{
  …
  shape_wrapper ptr_wrapper(
  create_shape(…));
  …
}

 

 这种清理并不限于释放内存,也可以是:

关闭文件(fstream 的析构就会这么做)

释放同步锁

释放其他重要的系统资源

应该:

std::mutex mtx;
void some_func()
{
    std::lock_guard<std::mutex> guard(mtx);
    // 做需要同步的工作
}

而不是:

std::mutex mtx;
void some_func()
{
    mtx.lock();
    // 做需要同步的工作……
    // 如果发生异常或提前返回,
    // 下面这句不会自动执行。
    mtx.unlock();
}

 

 

 

标签:RAII,wrapper,shape,C++,ptr,内存
From: https://www.cnblogs.com/JohnsonQ/p/16994803.html

相关文章

  • VScode配置支持c++11和配置自动编译调试功能
    VScode配置支持c++11和配置自动编译调试功能​​1在工程目录下新建.vscode目录​​​​2在.vscode目录下创建c_cpp_properties.json文件内容如下​​​​2.1添加c_cpp_pr......
  • c++ 去除字符串首尾的空白字符
    c++去除字符串首尾的空白字符​​方法一使用find_first_not_of和find_last_not_of​​​​方法二使用正则表达式(c++11)​​​​测试​​​​测试结果​​方法一使用find_f......
  • C++中的class
    用classqxz{};定义一个类,其中private:以下的每一行都是私有成员,而public:以下的每一行都是公有成员(两者可以反复交叉出现多次)。私有成员只能被自己类中的成员函数访问,而......
  • 安装 Python 包时解决 Microsoft visual c++ 14.0 is required 问题
     参考:​​http://www.hongweipeng.com/index.php/archives/1532/​​ 在windows上安装scrapy时经常会遇到这个问题,安装其他组件也可能会遇到。但问题解决办法都是大致......
  • vscode 调试 C++/JavaScript
     MicrosoftVisualStudioCode  在调试JavaScript代码时,其中三种比较简单:1.使用Chrome等浏览器调试2. 使用Ctrl+Shift+B 快捷键运行html文件,需要在Task......
  • ubuntu20.04下C++调用接口解压缩zip文件
     https://github.com/Lecrapouille/zipper Compiling/InstallingTodownloadtheprojectandcompileit:gitclonehttps://github.com/lecrapouille/zipper.g......
  • c++使用this的一个实例
    转载:原文地址正在做一个鼠标绘图程序,在一个class中需要调用鼠标响应函数setMouseCallback,由于setMouseCallback中的mousecallback不支持调用non-staticfunction,遇到了很......
  • C++冷门语法/关键字
    这篇文章将用来记录平时第一次遇到的语法或关键字,仅记录我使用到的功能,不进行拓展。volatileC/C++中的volatile关键字和const对应,用来修饰变量,通常用于建立语言级别......
  • c++用rapidjson解析json串
    业务需要消息传递以json形式,使用rapidjson。把json所有的值对存进一个map里,再根据业务需要判断指令。定义usingrapidjson_object=rapidjson::GenericObject<false,r......
  • UE4蓝图与C++
    C++委托蓝图注册//声明委托必须声明多播委托DECLARE_DYNAMIC_MULTICAST_DELEGATE(FRefresh);//声明委托字段{ UPROPERTY(BlueprintAssignable) FRefreshdTest;......