- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在查看 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
,直接调用locks的Lock()
成员函数需要在某处调用Unlock()
。但是,如果我们将资源“包装”到一个对象中,在我们需要的时间内持有它,并在析构函数中自动“释放”(释放、解锁等),则无需记住释放内存、解锁锁,等等等等
我建议您在提出更多问题之前先阅读 your C++ book 中关于类和构造函数与析构函数对的第一章。 (你确实有一本书,对吧?)
关于c++ - 为有经验的 C 程序员理解 C++ 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049619/
在 PHP 中,开始破解并弄清楚页面上发生的事情非常容易。只需输入一堆回声和 print_r,仅此而已。看来这种技术在 python 中对我不起作用。我通过在 python 照片上传模块中进行黑客攻击
程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享) 应届生面试经验参考:https://www.cnblogs.com/rainbow-1/p/16779048.html 简历: 1、
上图的意思: 百战百胜,屡试不爽. 故事 程序员小张: 刚毕业,参加工作1年左右,日常工作是CRUD 。 架构师老李: 多个大型项目经验,精通各种开发架构屠龙宝术;
周末了开心一下 谈到程序员,对于外行人来说一贯的印象就是格子衫大裤衩外加人字拖,蓬头(秃头)垢面黑眼圈,还有就是“人傻钱多死得快”🤣,这是外界对程序员固有的思想,但是作为新世纪的程序员,我们可没那么
我从事C++编程已有5年了,现在我意识到知道如何“不同地”思考的值(value)。 这个问题适用于尝试其他编程语言并遇到过类似情况的C++程序员: “哇,这太酷了!我不知道我可以那样编程。” “哇,我
互联网已经渗入我们生活的方方面面,于是我们就免不了会思考:如果有一天网络断了怎么办呢? 英国 Cable.co.uk 曾进行了一项有趣的"断网"调查,调查发现在 2500
这些是 “程序员可见” x86-64 寄存器: (来源:usenix.org) 隐形寄存器呢?刚刚才知道MMU寄存器,Interrupt Descriptor Table(IDT)使用了这些不可见的寄
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
有没有办法将 Dragon NaturallySpeaking 合并到事件驱动程序中?如果我使用 DNS 记录用户语音输入而不将其写入屏幕并直接保存为 XML,我的老板会非常喜欢它。我已经研究了好几天
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
这个问题在这里已经有了答案: 关闭12年前。 Possible Duplicate: Should I learn C before learning C++? 作为一名专业 (Java) 程序员和重
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在将一个使用串行端口的 C++ 程序(更准确地说是 Borland“组件”)“转换”为 Java。该程序使用一个线程来监听串行端口,并在收到给定的“事件字符”之一(可能是回车、ACK、NACK .
我是克里斯。我对编码很陌生,我不知道很多术语,这是我第三次也是最成功的学习 Java 的尝试。是的,如果我还年轻,效果就不太好。无论如何,我正在尝试创建游戏,但遇到了一个小问题。 我制作了一个 16
我是一名优秀的程序员,十分优秀!