【问题标题】:ofstream::open creates file, but then crashes (bad pointer in locale::getloc()?)ofstream::open 创建文件,但随后崩溃(locale::getloc() 中的指针错误?)
【发布时间】:2012-07-17 15:41:32
【问题描述】:

所以我有一些看起来像这样的代码,用 Visual Studio 2010 编写和编译:

if ( outputFile.is_open() )
{
    outputFile.close();
}
if ( !outputFile.is_open() ) // condition for sanity-checking
{
    outputFile.open("errorOut.txt", ios::out);
}

这会在访问冲突时崩溃。附加调试器显示第一个条件为假(outputFile 未打开),第二个条件为真(outputFile 已关闭,这很好,因为我刚刚检查过)。然后open() 被调用,最终locale::getloc() 尝试取消引用一个空指针,但我不知道为什么会发生这种情况(因为现在标准库中有三个类)。

有趣的是,文件“errorOut.txt”确实被创建了,即使 open 调用崩溃了。

我在调试器中看了几个小时,但老实说我不知道​​发生了什么。任何人都有任何想法甚至试图确定代码有什么问题?完全有可能其他地方的某些代码导致了这种情况(继承代码),但是有很多,我什至不知道去哪里找。到目前为止,一切似乎都很好。

【问题讨论】:

  • 什么编译器/平台?看起来不错ideone.com/HpEfV
  • 您是否尝试过在 Valgrind 等工具下运行它以查找代码中的内存踩踏错误?
  • @hmjd:Visual Studio 2010;将编辑它(因为忘记它而感到愚蠢)。更重要的是,这种结构似乎不会导致问题——其他地方相同或相似的代码(尽管使用不同的流)没有问题。这就是为什么我希望有更多了解ofstream::open() 内部细节的人出现,并且现在可以去其他地方看看。
  • @AdamRosenfield:从未听说过 Valgrind,我会调查一下。
  • 代码在哪里?在静态对象的构造函数中使用std::locale 时,我遇到了一些实现问题;至少有一个实现(stlport)不能确保它在第一次使用之前就已经构建好了。

标签: c++ file crash ofstream


【解决方案1】:

好的,我不确定这是否是处理此问题的最佳方法,但因为这涉及一些真正奇怪的行为(在 STL 函数中间崩溃,以及其他一些奇怪的事情,例如挂在 exit(1); 和之类的),我会在这里留下一个解释。

在我们的例子中,错误似乎源于我们继承的一些真正糟糕的代码中发生的一些内存损坏。清理代码通常可以消除这种崩溃和程序显示的其他奇怪行为。

我不知道这是否对任何人有用;也许简单地删除问题会更好。如果有人想发表评论,我实际上有点好奇我是否应该这样做。

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多