首页 > 解决方案 > 保持 ostream 打开

问题描述

我在我的 C++ 程序中创建了一个记录器。根据下面的代码,有什么我应该注意的问题吗?我主要关心在程序运行期间保持ostream 打开并通过不干净的方法退出程序(即退出控制台窗口)。系统会在程序退出后保持文件打开,还是会在终止时销毁 ostream 对象(不使用 Log::Close() 函数)。

我的思路是:当我可以打开一次并在退出时关闭它时,为什么要一遍又一遍地打开/关闭它?

#ifndef LOG_HPP
#define LOG_HPP

#include <fstream>

namespace Log
{
    static const char* File = "Logs\\Log.log";
    static std::ofstream Log;

    void Initialize()
    {
        Log.open(File, std::ios::app);
    }

    void Record(const char* Message)
    {       
        Log << Message;
    }

    void Close()
    {
        Log.close();
    }

}; // namespace Log

#endif

标签: c++ostream

解决方案


C++ 标准没有定义当您通过不干净的方法退出程序时会发生什么(即退出控制台窗口)。

但是,它确实定义了您调用std::abort.

调用std::abort()in 声明的函数会<cstdlib>终止程序,而不执行任何析构函数,也不调用传递给std::atexit()or的函数std::at_quick_exit()

不干净地退出程序最有可能的结果是您期望在std::abort()被调用时看到的结果。

系统是否会在程序退出后保持文件打开

即使在完全退出程序时调用的对象的析构函数在异常终止时不会被调用,操作系统很可能会关闭打开的文件句柄。至少这是我在 Windows 和 Linux 中观察到的。如果有任何与输出文件/流关联的未刷新缓冲区,您将不会看到它们被刷新。


推荐阅读