来自维基百科的RAII示例

时间:2013-04-26 18:42:20

标签: c++ wikipedia raii

我看着the C++ example of RAII on wikipedia,我发现了一些对我没有意义的事情。

以下是代码段本身,全部归功于维基百科:

#include <string>
#include <mutex>
#include <iostream>
#include <fstream>
#include <stdexcept>

void write_to_file (const std::string & message) {
    // mutex to protect file access
    static std::mutex mutex;

    // lock mutex before accessing file
    std::lock_guard<std::mutex> lock(mutex);

    // try to open file
    std::ofstream file("example.txt");
    if (!file.is_open())
        throw std::runtime_error("unable to open file");

    // write message to file
    file << message << std::endl;

    // file will be closed 1st when leaving scope (regardless of exception)
    // mutex will be unlocked 2nd (from lock destructor) when leaving
    //     scope (regardless of exception)
}

最后的评论说:“文件将首先关闭......互斥将被解锁第二......”。我理解RAII的概念,我得到了代码正在做的事情。但是,我没有看到(如果有的话)保证该评论所声称的顺序。

以问号结束:在互斥锁解锁之前,文件是什么保证关闭?

2 个答案:

答案 0 :(得分:6)

  

什么保证在互斥锁解锁之前关闭文件?

因为这就是C ++的设计方式:范围对象(无论范围是什么:类,函数,本地块,...)都按照它们初始化的相反顺序销毁。实际上没有什么可说的了,它只是规范的一部分。

答案 1 :(得分:1)

背后的原因是函数的调用堆栈是如何工作的。调用堆栈是存储函数局部变量的内存的一部分(除了其他东西)。调用堆栈的工作方式就像一堆板。函数内的每个新变量都会在其堆中添加一个板。在功能结束时,从顶部开始将所有板从堆中移除。这与创作的顺序相反。

有关调用堆栈的更多信息,请查看此处: http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/