gpt4 book ai didi

c++ - 写入未打开的 std::ofstream

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:31 27 4
gpt4 key购买 nike

<分区>

我最近写了一些我认为没问题的代码,但一位同事说它导致我们的应用程序随机崩溃。有问题的代码正在写入未打开的流。我的问题是:写入未打开的 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,初步测试没有发现任何问题。只有在运行较长时间时才会发生崩溃。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com