最近我写了一些代码,我认为还不错,但是我的同事说它会在我们的应用程序中导致随机崩溃。 有问题的代码正在写入未打开的ofstream。 我的问题是:是否可以安全地向尚未打开的ofstream写入内容? 当一个类的初始化不能为记录调试信息而打开其ofstream时就会出现这种情况。 但是后续的方法仍然会使用未打开的ofstream。 下面是一个例子:
class A {
public:
A(const std::string& fname) {
if (!fname.empty()) {
m_debug_log.open(fname.c_str());
}
}
void DoSomething() {
m_debug_log << "doing something useful now" << std::endl;
}
private:
std::ofstream m_debug_log;
};
我的同事说他通过在所有对m_debug_log
的输出操作上进行ofstream有效性检查来停止了随机崩溃。这样,只有在m_debug_log
是有效的输出流时才会执行输出操作。
void DoSomething() {
if (m_debug_log)
m_debug_log << "doing something useful now" << std::endl;
}
当然,只有在流有效时才写入是最合理的。但我从未想到向未打开的ofstream写入会导致正确性问题。(是的,这样效率很低,但当时编码速度是我的最高优先事项。)
我快速搜索了一下,但没有找到关于这个问题的明确解释。特别是我没有看到任何关于在写入未初始化的ofstream时发生未定义行为的明确说明。最初的实现应该是正确的吗?我的问题是普遍的问题,而不是特定实现的问题。就我所知,我经常使用VS 2010、VS 2013、Ubuntu 12.04和Centos 6.3,在初始测试中没有发现任何问题。只有在运行时间较长时才会出现崩溃。
std::fstream
应该仍然是稳定的。不过,在标准中找到明确提到这一点会很有趣。 - Galik