RAII 技巧
RAII 技巧
- 资源获取即初始化
- 三个保证
- 构造器获取内存或资源
- 析构器释放内存或资源
- 生命周期结束后,自动调用析构器(失效即释放)
- 关键的意义:异常免疫,保证资源的正确释放
- 三个保证
实例
- RAII-mutex
1
2
3
4
5
6
7
8
9
10
11template <class Mutex>
class lock_guard {
public:
lock_guard(Mutex& mutex) : mutex_(mutex) { mutex_.lock(); }
~lock_guard() { mutex_.unlock(); }
// 禁止复制和赋值
lock_guard(lock_guard const&) = delete;
lock_guard& operator=(lock_guard const&) = delete;
private:
Mutex& mutex_;
}; - RAII-smart Pointer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23template<class T>
class SmartPoint
{
public:
SmartPoint(T *ptr = nullptr) :point(ptr) {}
~SmartPoint() {
if (point) {
// 会调用point指向对象的的析构函数
delete point;
}
}
// 使用智能指针就像使用内部包裹的的对象一样
T& operator*() {
return *point;
}
T* operator->() {
return point;
}
private:
T* point;
}; - RAII-装饰器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26template <typename funcStart, typename funcEnd>
class scopeField {
public:
enum funcSelector : int {
First;
Second;
}
public:
scopeField(funcStart start, funcEnd end) : _start(start), _end(end) {
_start();
};
~scopeField() {
_end();
}
void func(funcSelector func) {
func == funcSelector::First ? _start() : _end();
}
private:
funcStart _start;
funcEnd _end;
}
Invitation
夕阳的刻痕
781263509
created:03/09/2020
Welcome, myFriend
Use this card to join the candyhome and participate in a pleasant discussion together .
Welcome to Aker’s candyhome,wish you a nice day .
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Aker's Blog!
评论