我正在查看MongoDB的源代码,并在函数内部看到以下声明,在我的C编程经验中我不理解也没有看到它。

Lock::DBLock dbLock(txn->lockState(), ns.db(), MODE_X);

我试图了解该声明在C++术语中的作用(即,我想了解语法,而不是有关所发生功能的细节)。

这分为两个主要问题:
1)函数前面的Lock::DBLock语句的目的是什么?
2)这是函数调用还是函数声明?

最佳答案

它是带有构造函数的变量声明-因此,它既是[对象构造函数的]函数调用,又是变量的声明。

它声明了一个类型的变量;

  Lock::DBLock

该变量称为dbLock。它使用txn->lockState()ns.db()MODE_X调用构造函数。

我的猜测是txn->lockState实际上返回一个锁定对象,而我们锁定的是ns.db()-在“独占模式”下。但这只是一个猜测,您必须在环境中查找这些内容。

在不查找文档的情况下,我希望Lock::DBLock是一个“锁管理器”,换句话说,它在创建时就采用了锁,而在销毁时就释放了。

一个简单的锁管理器如下所示:
 class LockMgr
 {
      LockMgr(SomeLockType &X) : keeper(X)
      {
         keeper.Lock();
      }
      ~LockMgr()
      {
         keeper.Unlock();
      }
      private:
        SomeLockType& keeper;    // Must be reference to original lock
 };

当变量超出范围时会自动调用析构函数(更糟的是,当您离开变量所在的{}对时)。

在C++中,一种用于“资源处理”的通用策略称为RAII(资源获取即初始化)-变量用于保存资源,并在初始化期间分配。这对“不要忘记撤消”有很大帮助-例如,在返回到函数中间的代码,执行break退出循环或类似操作的代码中。在C语言中,您始终必须注意释放锁,关闭文件,释放内存等步骤-当然,如果以错误的方式使用C++,您可能会陷入同样的​​陷阱-调用new肯定需要一个调用delete,直接调用锁Lock()成员函数需要在某个地方进行Unlock()调用。但是,如果我们在需要的时间内将资源“包装”到保存它的对象中,并在析构函数中自动“释放”(释放,解锁等),则无需记住释放内存,解锁锁,等等等

我建议在询问其他问题之前,请先阅读有关your C++ book中的类以及构造函数和析构函数对的第一章(您确实有一本书,对吗?)

10-08 07:56