Skip to content

Object-based resource management

一、本节标题的含义是: 基于object的resource management。

二、本章讨论C++中实现object-based resource management的各种idiom。

通过C++中的各种established idiom,来实现strong resource safety: strong exception safety: 不会resource leak

Object-based resource management

C++ value semantic是Object-based resource management的前提

Object是C++的data model、C++允许programmer对object lifetime进行control、参见 zhihu zhihu 如何评价 C++11 的右值引用(Rvalue reference)特性? - zihuatanejo的回答 - 知乎,简而言之就是: C++支持value semantic。这是使用"Object-based resource management"的前提条件。

Object-based resource management: 将object 和 resource进行bind

1、将object 和 resource进行bind,然后就可以基于object来对resource进行management,关于此的非常好的论述是:

CppCoreGuidelines R.1: Manage resources automatically using resource handles and RAII (Resource Acquisition Is Initialization)

2、C++中很多resource相关的idiom都是基于"Object-based resource management"思想的

3、C++中,一般不会直接使用一个resource,而是会将它bind到一个object

Example

1、Smart pointer

std::share_ptrstd::smart_ptr都是基于这个思路的:

std::share_ptr: reference count 等于 live object 个数

std::smart_ptr: resource 和 object 直接绑定

2、resource wrapper

明确resource ownership

对于resource management,需要resource ownership,这在 Copyable-and-movable 中进行了深入讨论。

Resource wrapper

使用"Single responsibility+rule of three/five/zero+RAII"来实现Resource wrapper。

Copyable and movable

参见 Copyable-and-movable 章节。

Idioms

RAII

一、避免leakage

参见 RAII 章节。

Rule of three/five/zero

参见 Rule-of-zero-three-five 章节。

Copy-and-swap-idiom

参见 Copy-and-swap-idiom 章节。

Scope-guard

参见 Scope-guard 章节。

Resource-return

参见 Resource-return 章节。