c++ - 保持 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++ 标准没有定义当您通过不干净的方法退出程序时会发生什么(即退出控制台窗口)。
但是,它确实定义了您调用std::abort
.
调用
std::abort()
in 声明的函数会<cstdlib>
终止程序,而不执行任何析构函数,也不调用传递给std::atexit()
or的函数std::at_quick_exit()
。
不干净地退出程序最有可能的结果是您期望在std::abort()
被调用时看到的结果。
系统是否会在程序退出后保持文件打开
即使在完全退出程序时调用的对象的析构函数在异常终止时不会被调用,操作系统很可能会关闭打开的文件句柄。至少这是我在 Windows 和 Linux 中观察到的。如果有任何与输出文件/流关联的未刷新缓冲区,您将不会看到它们被刷新。
推荐阅读
- javascript - 滚动滑动太快
- amazon-web-services - 我需要将越来越多的任务分散到几台服务器上,我是否启动 VPS 并继续添加更多?更可扩展的东西?
- html - 在 postgres 表中的两个 html 标记之间附加
- java - 扫描仪上的数字类型
- c# - Microsoft Azure 物联网中心
- php - Facebook页面私人回复不起作用
- node.js - Jhipster 热重载导致节点崩溃
- c# - 根据请求对象属性动态构建查询
- java - Java Spring-boot 由以下原因引起:org.springframework.data.mapping.PropertyReferenceException:找不到类型的属性 ID
- mysql - 如何在 Windows 中使用 MySQL Workbench 批量编辑 .sql 转储文件?