我在C ++程序中创建了一个记录器。根据以下代码,我应该注意哪些问题?我主要关心的是在程序持续时间内打开ostream并通过不干净的方法退出程序(即x从控制台窗口退出)。系统是否会在程序退出之后保持文件打开,或者在终止时将摧毁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
答案 0 :(得分:2)
系统是否会在程序退出之后保持文件打开
没有!程序退出后,如果退出&#34;正常&#34;时尚或将被任何OS命令或控制台控制序列杀死,几乎所有程序资源都将被释放。
据我所知,唯一未完全删除的资源是命名管道。肯定会删除普通文件句柄。
但: 最后一个缓冲区内容可能不会写入磁盘上的物理文件或写入的任何位置。因此,在每次写入后直接刷新()是个好主意。
答案 1 :(得分:1)
C ++标准没有定义当你通过不干净的方法退出程序时会发生什么(即x出控制台窗口)。
但是,它确实定义了您致电std::abort
时的预期结果。
调用
std::abort()
中声明的函数<cstdlib>
会终止程序而不执行任何析构函数,也不会调用传递给std::atexit()
或std::at_quick_exit()
的函数。
不可靠地退出该计划的最有可能的结果是在std::abort()
被调用时您期望看到的结果。
系统是否会在程序退出之后保持文件打开
即使在干净地退出程序时调用的对象的析构函数也不会在异常终止时被调用,操作系统很可能会关闭打开的文件句柄。至少这是我在Windows和Linux中观察到的。如果有任何与输出文件/流关联的未刷新缓冲区,则不会看到它们被刷新。
答案 2 :(得分:1)
我不会关心那么多关闭的文件句柄。正如Klaus所说,在写完每条信息之后冲洗信息流更为重要
在Windows上,您始终可以使用SEH框架,__ try / __ finally块。无论你如何退出__try,__finally都会被执行,即使在抛出或返回之后也是如此。我希望你用try / catch获得类似的结果,只是不要在try块中使用return。或者看看这里:
__try/__finally equivalent in UNIX