资源安全

作者: 刘光聪 | 来源:发表于2018-06-28 15:05 被阅读120次

提出问题

在所有异常分之里记得释放资源,存在较为严重的安全隐患。此处,引入ScopedExit的封装,使用C++特有的RAII机制,在析构函数中完成资源的安全释放;即使程序在运行中抛出异常,也能保证资源的安全释放。

函数指针

int fd = open("file.dat", O_RDONLY);
ScopedExit e(fd, close);

Lambda表达式

File* f = fopen("file.dat", "r");
ScopedExit e(f, [](FILE* f) {
  fclose(f);
});

ScopedExit实现

此处,显式地加上+deleter,使得lambda表达式能够安全地转型为原生的函数指针类型。举个例子,auto test = +[]{}test的类型推演为void(*)()

class ScopedExit {
  using Handle  = void*;
  using Deleter = void(*)();
  using Wrapper = void(*)(Deleter*, Handle*);

  Wrapper wrapper;
  Deleter deleter;
  Handle handle;

public:
  template<typename T, typename D>
  ScopedExit(T handle, D deleter)
      : deleter(reinterpret_cast<Deleter>(+deleter))
      , handle(reinterpret_cast<Handle>(handle)) {
    wrapper = [](Deleter* deleter, Handle* handle) {
      auto d = (*reinterpret_cast<D*>(deleter));
      auto h = (*reinterpret_cast<T*>(handle));
      d(h);
    };
  }

  ~ScopedExit() {
    wrapper(&deleter, &handle);
  }
};

相关文章

  • 资源安全

    提出问题 在所有异常分之里记得释放资源,存在较为严重的安全隐患。此处,引入ScopedExit的封装,使用C++特...

  • 线程安全

    线程安全 线程安全定义:线程间共享可变资源(内存)。 实现线程安全的方法:不共享资源。使用可重入函数,不对外部资源...

  • 04.马斯洛需求层次理论

    01.生存 生理需求 呼吸、水、食物、睡眠、生理平衡、性 安全需求 人身安全、家庭安全、资源安全、财产安全、健康保...

  • jdk10-ReentrantLock重入锁源码分析(上)

    1. 线程安全 多个线程对公共资源进行非原子操作,就会存在线程安全问题 多线程环境多个线程共享一个资源对资源进行非...

  • OSS-05-资源分配与调度

    1、资源管理功能:资源数据结构的描述、确定资源的分配原则 (调度原则)、实施资源分配、存取控制和安全保护 2、资源...

  • 安全资源整理

    【1】缺陷周话文章 《缺陷周话》第1期:空指针解引用:https://www.freebuf.com/articl...

  • iOS 面试 --- 网络

    get 和 post的区别? get:是用来获取资源的安全的、幂等的、可缓存的 post:是用来处理资源的非安全的...

  • 进程与线程、线程池

    进程与线程的相关总结进程与线程的简单解释进程: 基本的资源分配资源线程: 最小调度单元 线程安全 线程安全是多线程...

  • 并发—高并发

    并发:多个线程操作相同的资源,保证线程安全,合理使用资源高并发:服务能同时处理很多请求,提高程序性能 线程安全性 ...

  • 线程安全与可重入

    线程安全 线程安全问题是由于线程之间存在共享变量(共享资源、临界资源、临界区)引起的。由于CPU的调度,多个线程访...

网友评论

    本文标题:资源安全

    本文链接:https://www.haomeiwen.com/subject/jvmgyftx.html