Итак, у меня есть примерно такой код, написанный и скомпилированный с помощью 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
.
Я провел несколько часов, наблюдая за этим в отладчике, но, честно говоря, понятия не имею, что происходит. У кого-нибудь есть идеи даже попытаться определить, что не так с кодом? Вполне возможно, что какой-то код в другом месте способствует этой ситуации (унаследованный код), но его много, и я даже не знаю, где искать. Все до этого момента вроде нормально.
ofstream::open()
, появится и может теперь искать, где еще искать. - person KRyan   schedule 17.07.2012std::locale
в конструкторах статических объектов; по крайней мере одна реализация (stlport) не гарантирует, что она создана перед первым использованием. - person James Kanze   schedule 17.07.2012