effective c++ 条款14:在资源管理类中小心拷贝行为

注意:

  • 赋值RAII对象必须一并复制它所管理的资源,所以资源的拷贝行为决定RAII对象的拷贝行为。
  • 普遍而常见的RAII类拷贝行为是:抑制拷贝,实行引用计数法。
void lock(Mutex* pm);
void unlock(Mutex* pm);

class Lock
{
public:
    explicit Lock(Mutex* pm)
      : mutexPtr(pm)
    { lock(mutexPtr); }
    ~Lock() { unlock(mutexPtr); }
private:
    Mutex* mutexPtr;
};

Mutex m;
...
{
    Lock ml(&m);
    ...
} // 在块末尾,自动解除lock

Lock ml1(&m);
Lock ml2(ml1); //将ml1复制到ml2身上,会发生什么?

解决办法
1. 禁止复制,把拷贝操作定义为private。

2. 使用引用记数法。这里可以使用编译器生成的默认析构函数,其会自动调用非静态成员变量(本例中为mutexPtr)的析构函数。mutexPtr的析构函数会在引用计数为0时自动调用tr1::shared_ptr的删除器(本例为unlock)。

class Lock {
public:
    explicit Lock(Mutex* pm)
      : mutexPtr(pm, unlock)
    {
        lock(mutexPtr.get();)
    }
private:
    std::tr1::shared_ptr<Mutex> mutexPtr;
}

原文地址:https://www.cnblogs.com/pfsi/p/9195221.html

时间: 2024-10-04 17:55:40

effective c++ 条款14:在资源管理类中小心拷贝行为的相关文章

Effective C++ -----条款14: 在资源管理类中小心copying行为

复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 普遍而常见的RAII class copying行为是:抑制copying(使用私有继承Uncopyable).施行引用计数法(reference counting)(即std::tr1::shared_ptr,可以自己指定删除器).不过其他行为也都可能被实现.

Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们

effective条款15,在资源管理类中小心copying行为

class A { private: int *p; void lock(){ cout << p << "is lock" << endl; } void unlock(){ cout << p << "is non-lock" << endl; } public: A(int* a) :p(a){ lock(); } ~A(){ unlock(); } }; int main() { int

读书笔记 effective c++ Item 14 对资源管理类的拷贝行为要谨慎

1. 自己实现一个资源管理类 Item 13中介绍了 “资源获取之时也是初始化之时(RAII)”的概念,这个概念被当作资源管理类的“脊柱“,也描述了auto_ptr和tr1::shared_ptr是如何用堆资源来表现这个概念的.然而并不是所有资源都是在堆上创建的,对于这种资源,像auto_ptr和tr1::shared_ptr这样的智能指针就不适合当作资源句柄(handle)来使用了.你会发现你时不时的就会需要创建自己的资源管理类. 举个例子,假设你正在使用C API来操纵Mutex类型的互斥信

EC笔记:第三部分:14、在资源管理类中小心Copying行为

场景 上一节实现了智能指针,其中的拷贝构造函数和赋值运算符是通过增加/减少指针的引用计数来操作的.但是如果是管理一个独占资源呢?我们希望在一个资源使用时被锁定,在使用完毕后被释放. #include <mutex> #include <thread> #include <iostream> using namespace std; mutex mu; int rc=5; void thread1(){ //mu.lock(); rc+=5; cout<<&q

[014]在资源管理类中小心copying行为

第一节 <背景> 条款13中讲到“资源取得的时机便是初始化时机”并由此引出“以对象管理资源”的概念.通常情况下使用std中的auto_ptr(智能指针)和tr1::shared_ptr(引数智能指针)作为管理资源的对象.事实上,这种管理方法十分有效.但是,auto_ptr和tr1::shared_ptr只能管理基于堆(heap-based)的资源,而非heap-based的资源却往往不适合.因此,有的时候你需要建立自己的资源管理类.本文介绍的内容是在你建立自己的资源管理类时应该注意的事项. 第

条款14:在资源管理类中小心coping行为

以对象管理资源之后,某些资源不允许被复制,这时对象应该被private声明,为了资源在最后一次使用之后被释放应该使用shared_ptr并且给出对应的删除器: 注意:

Effective C++——条款14(第3章)

条款14:    在资源管理类中小心copying行为 Think carefully about copying behavior in resource-managing classes 条款13导入这样的观念:"资源取得时机便是初始化时机"(Resource Acquisition Is Initializaiton,RAII),并以此作为"资源管理类"的脊柱,也描述了auto_ptr和tr1::shared_ptr如何将这个观念表现在heap-based资源

Effective C++ 条款15、16 在资源管理类中提供对原始资源的访问||成对使用new 与 delete要采取相同形式

1.在资源管理类中提供对原始资源的访问     前几个条款很棒,它们是对抗资源泄露的壁垒,但很多APIs直接指向 资源,这个时候,我们需要直接访问原始资源.     这里,有两种方法解决上述问题,我们可将RAII对象转换为原始资源.通过 显式转换与隐式转换.     通常,tr1:: shared_ptr 和 auto_ptr 都提供一个get成员函数,用来执行显式转换,也就是返回智能指针内部的原始指针的复件.因为它也重载了指针取值操作符* –>.当然也可以通过隐式转换为底部原始指针.