ofstream::open создает файл, но затем вылетает (неверный указатель в locale::getloc()?)

Итак, у меня есть примерно такой код, написанный и скомпилированный с помощью 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.

Я провел несколько часов, наблюдая за этим в отладчике, но, честно говоря, понятия не имею, что происходит. У кого-нибудь есть идеи даже попытаться определить, что не так с кодом? Вполне возможно, что какой-то код в другом месте способствует этой ситуации (унаследованный код), но его много, и я даже не знаю, где искать. Все до этого момента вроде нормально.


person KRyan    schedule 17.07.2012    source источник
comment
Какой компилятор/платформа? Вроде нормально ideone.com/HpEfV   -  person hmjd    schedule 17.07.2012
comment
Пробовали ли вы запускать его с помощью такого инструмента, как Valgrind, для поиска ошибок памяти в вашем коде?   -  person Adam Rosenfield    schedule 17.07.2012
comment
@hmjd: Visual Studio 2010; отредактирует это (чувствую себя глупо, если забыл об этом). Что еще более важно, эта конструкция, по-видимому, не вызывает проблем - идентичный или аналогичный код в другом месте (хотя и с разными потоками) не вызывает проблем. Вот почему я надеюсь, что кто-то, кто знает больше о внутренних деталях ofstream::open(), появится и может теперь искать, где еще искать.   -  person KRyan    schedule 17.07.2012
comment
@AdamRosenfield: Никогда не слышал о Valgrind, я посмотрю на это.   -  person KRyan    schedule 17.07.2012
comment
Где код? У меня были проблемы с некоторыми реализациями при использовании std::locale в конструкторах статических объектов; по крайней мере одна реализация (stlport) не гарантирует, что она создана перед первым использованием.   -  person James Kanze    schedule 17.07.2012
comment
@JamesKanze: Насколько я понимаю ваш вопрос, он просто в (нестатическом) методе класса.   -  person KRyan    schedule 17.07.2012


Ответы (1)


Хорошо, я не совсем уверен, что это лучший способ справиться с этим, но поскольку это связано с действительно странным поведением (сбой в середине функции STL и некоторые другие странности, такие как зависание на exit(1); и тому подобное), я оставлю объяснение здесь на будущее.

В нашем случае ошибка, похоже, возникла из-за некоторого повреждения памяти, происходящего в каком-то действительно ужасном коде, который мы унаследовали. Очистка кода в целом устранила этот сбой и другие странности поведения программы.

Я не знаю, будет ли это кому-нибудь полезно; может быть, было бы лучше просто удалить вопрос. Мне на самом деле несколько любопытно, должен ли я был, если кто-то хочет оставить комментарий.

person KRyan    schedule 24.07.2012