资源安全

正文共296个字,预计阅读时间5分钟。

提出问题

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

函数指针

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

Lambda表达式

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

ScopedExit实现

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

 1class ScopedExit {
 2using Handle  = void*;
 3using Deleter = void(*)();
 4using Wrapper = void(*)(Deleter*, Handle*);
 5
 6Wrapper wrapper;
 7Deleter deleter;
 8Handle handle;
 9
10public:
11template<typename T, typename D>
12ScopedExit(T handle, D deleter)
13: deleter(reinterpret_cast<Deleter>(+deleter))
14, handle(reinterpret_cast<Handle>(handle)) {
15wrapper = [](Deleter* deleter, Handle* handle) {
16auto d = (*reinterpret_cast<D*>(deleter));
17auto h = (*reinterpret_cast<T*>(handle));
18d(h);
19};
20}
21~ScopedExit() {
22wrapper(&deleter, &handle);
23}
24};

原文链接:https://www.jianshu.com/p/d8d1dc07a5c7

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2018-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿天地

Netty粘包拆包解决方案

前言 本篇文章是Netty专题的第六篇,前面五篇文章如下: 高性能NIO框架Netty入门篇 高性能NIO框架Netty-对象传输 高性能NIO框架Netty...

4657
来自专栏JAVA技术站

JFinal 参数校验插件扩展,让后台参数校验像js一样方式好用

email=^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$,"邮箱格式不正确" chinese=^[...

2662
来自专栏wannshan(javaer,RPC)

dubbo通信消息解析过程分析(1)

由于rpc底层涉及网络编程接口,线程模型,网络数据结构,服务协议,细到字节的处理。牵涉内容较多,今天就先从一个点说起。 说说,dubbo通过netty框架做传...

4766
来自专栏码匠的流水账

No thread-bound request found异常

本文主要研究下spring mvc的No thread-bound request found异常

2160
来自专栏程序猿DD

Spring框架中的设计模式(三)

在之前的两篇文章中,我们看到了一些在Spring框架中实现的设计模式。这一次我们会发现这个流行框架使用的3种新模式。 本文将从描述两个创意设计模式开始:原型和...

4177
来自专栏美码师

补习系列-springboot 参数校验详解

在定义 Restful 风格的接口时,通常会采用 PathVariable 指定关键业务参数,如下:

5781
来自专栏源码之家

word如何自动分割成多个文档

3835
来自专栏分布式系统进阶

Kafka中Message存储相关类大揭密Kafka源码分析-汇总

1721
来自专栏码匠的流水账

聊聊eureka server的response cache

eureka-core-1.8.8-sources.jar!/com/netflix/eureka/resources/ApplicationResource....

1033
来自专栏Hongten

利用Velocity自动生成自定义代码_java版_源码下载

=======================================================

1492

扫码关注云+社区