我正在查看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中的类以及构造函数和析构函数对的第一章(您确实有一本书,对吗?)