C++ open创建文件,但随后崩溃(locale::getloc()中的指针不正确)
所以我有一些代码看起来像这样,是用Visual Studio 2010编写和编译的:C++ open创建文件,但随后崩溃(locale::getloc()中的指针不正确),c++,file,crash,ofstream,C++,File,Crash,Ofstream,所以我有一些代码看起来像这样,是用Visual Studio 2010编写和编译的: if ( outputFile.is_open() ) { outputFile.close(); } if ( !outputFile.is_open() ) // condition for sanity-checking { outputFile.open("errorOut.txt", ios::out); } 这会因访问冲突而崩溃。附加调试器显示第一个条件为false(outputF
if ( outputFile.is_open() )
{
outputFile.close();
}
if ( !outputFile.is_open() ) // condition for sanity-checking
{
outputFile.open("errorOut.txt", ios::out);
}
这会因访问冲突而崩溃。附加调试器显示第一个条件为false(outputFile
未打开),第二个条件为true(outputFile
已关闭,这很好,因为我刚刚检查了它)。然后调用open()
,最终locale::getloc()
尝试取消对空指针的引用,但我不知道为什么会发生这种情况(因为现在标准库中有三个类)
有趣的是,即使open
调用崩溃,仍然会创建文件“errorOut.txt”
我花了几个小时在调试器中观看,但我真的不知道发生了什么。有人有什么想法,甚至试图确定什么是错误的代码?完全有可能是其他地方的一些代码导致了这种情况(继承的代码),但是有很多代码,我甚至不知道该去哪里查找。这一点似乎很好。 < P> OK,我不确定这是否是最好的处理方法,但是由于这涉及到一些奇怪的行为(在STL函数的中间崩溃,还有一些类似于“代码>退出(1);< /代码>等)的奇怪现象),我将在这里为将来做一个解释。 在我们的例子中,错误似乎源于我们继承的一些非常糟糕的代码中正在发生的内存损坏。清理代码通常可以消除此崩溃和程序显示的其他奇怪行为
我不知道这是否对任何人有用;也许删除这个问题会更好。我确实有点好奇,如果有人想留下评论。 < P> OK,我不确定这是不是最好的处理方法,但是因为这涉及到一些真正奇怪的行为(在STL函数的中间崩溃,还有其他一些奇怪的现象,比如挂在代码>退出(1);等),我会在这里为将来留下解释 在我们的例子中,错误似乎源于我们继承的一些非常糟糕的代码中正在发生的内存损坏。清理代码通常可以消除此崩溃和程序显示的其他奇怪行为
我不知道这是否对任何人有用;也许删除这个问题会更好。实际上,我有点好奇,如果有人想留下评论,我是否应该这样做。什么编译器/平台?看起来不错,您是否尝试过在Valgrind之类的工具下运行它来查找代码中的内存占用错误?@hmjd:Visual Studio 2010;将在中编辑(因为忘记它而感到愚蠢)。更重要的是,这种构造似乎不会导致问题——其他地方相同或相似的代码(尽管具有不同的流)没有问题。这就是为什么我希望有人能更多地了解流::open()的
的内部细节,现在可以到其他地方去寻找。@AdamRosenfield:从没听说过Valgrind,我会去调查的。代码在哪里?在静态对象的构造函数中使用std::locale
时,我遇到了一些实现问题;至少有一个实现(stlport)不能确保它在首次使用之前构造。什么编译器/平台?看起来不错,您是否尝试过在Valgrind之类的工具下运行它来查找代码中的内存占用错误?@hmjd:Visual Studio 2010;将在中编辑(因为忘记它而感到愚蠢)。更重要的是,这种构造似乎不会导致问题——其他地方相同或相似的代码(尽管具有不同的流)没有问题。这就是为什么我希望有人能更多地了解流::open()
的的内部细节,现在可以到其他地方去寻找。@AdamRosenfield:从没听说过Valgrind,我会去调查的。代码在哪里?在静态对象的构造函数中使用std::locale
时,我遇到了一些实现问题;至少有一个实现(stlport)不能确保它是在首次使用之前构建的。