在资源管理类中小心copying行为
类Lock定义如下:
class Lock
{
public:
explicit Lock(Mutex* pm)
: mutexPtr(pm)
{
lock(mutexPtr);
}
~Lock()
{
unlock(mutexPtr);
}
private:
Mutex* mutexPtr;
}
使用方法如下:
Muext m;
...
{
Lock m1(&m); // 锁定mutex
...
} // 自动解除锁定mutex
当一个RAII对象被复制,会发生:
禁止赋值
将其copying函数都设置为只声明而不定义的private,或者继承者Uncopyable。
对底层资源祭出"引用计数法"
可以std::shared_ptr实现,但必须给出一个”删除器“(deleter), 删除器是一个函数或者函数对象,当引用计数为0是会被自动调用。
void Unlock(Mutex* pm)
{
unlock(pm);
}
class Lock
{
public:
explicit Lock(Mutex* pm)
: mutexPtr(pm, Unlock)
{
lock(mutexPtr.get());
}
// Lock的析构函数会主动调用unlock函数来释放Mutex
private:
std::shared_ptr<Mutex> mutexPtr;
}
这里必须要添加删除器来处理Mutex的释放。如果使用默认的delete,操作将是删除Mutex而不是释放Mutex。
复制底部资源
深拷贝
转移底部资源的拥有权
使用auto_ptr
请记住:
- 赋值RAII对象必须一并赋值它所管理的资源,所以 资源的copying行为决定RAII对象的copying行为。
- 普通而常见的RAII class copying行为是:抑制copying、施行引用计数法(reference counting)。不过其他行为也都可以被事项。
探讨了资源获取即初始化(RAII)模式下资源管理类的copying行为,介绍了如何通过禁止赋值、引用计数法及转移底部资源所有权等方式处理资源复制问题。
953

被折叠的 条评论
为什么被折叠?



