【发布时间】: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)不能确保它在第一次使用之前就已经构建好了。