Проблема при отключении проверенных итераторов в vs2008 SP1 (_HAS_ITERATOR_DEBUGGING = 0) - PullRequest
7 голосов
/ 24 апреля 2009

У меня были некоторые проблемы с vs2008 SP1, работающим в режиме отладки, когда я пытался отключить проверенные итераторы. Следующая программа воспроизводит проблему (сбой в строковом деструкторе):

#define _HAS_ITERATOR_DEBUGGING 0

#include <sstream>

int do_stuff(std::string const& text)
{
    std::string::const_iterator i(text.end());
    return 0;
}

int main()
{
    std::ostringstream os;
    os << "some_text";
    return do_stuff(os.str());
}

Я нашел аналогичный пост на gamdev.net, в котором обсуждалась проблема с vs2005. Пример программы в этом посте компилируется для меня на SP1 2008 как есть - но когда я изменил его для использования ostringstream, я смог решить проблему.

После поиска в отладчике похоже, что библиотека выталкивает итераторы из стека, а затем пытается использовать их в _Orphan_All, который является своего рода итератором, проверяющим код очистки ...

Может кто-нибудь еще воспроизвести эту проблему или сказать мне, что происходит?

Спасибо!

Ответы [ 4 ]

6 голосов
/ 25 апреля 2009

Я только что попробовал это в VS2008 на Windows XP и получил предупреждение о переполнении буфера, как на VS2008 до, так и после SP1.

Интересно, что проблема заключается в передаче строки в do_stuff либо по ссылке, либо по значению - если я использую оригинальный код, он жалуется на переполнение буфера, но если я передаю строку в значении , работает нормально. Это с многопоточной средой выполнения DLL отладки. Ошибка исчезает, если вам нравится статическая среда выполнения MT Debug.

В обоих случаях предварительно скомпилированные заголовки были отключены, а файлы, которые обычно генерируют предварительно скомпилированные заголовки, были удалены из проекта.

После прочтения этой статьи на MSDN Мне интересно, не связана ли эта проблема с тем фактом, что несколько классов стандартной библиотеки C ++ на самом деле находятся в библиотеке времени выполнения, если вы строите с помощью отладочной DLL-библиотеки (просто связать сгенерированный VS2008 двоичный файл с более ранней библиотекой и следить за нерешенными внешними данными, чтобы подтвердить это).

4 голосов
/ 25 апреля 2009

Похоже, это известная ошибка в VS2005, исправленная в VS2005 SP1:

Похоже, это было сделано парнем, который написал об этом на gamedev.net.

Я не уверен, как или почему он мог бы вернуться в VS2008 (есть ли у вас заголовки из VS2005, которые могут быть получены или что-то в этом роде?)

1 голос
/ 07 мая 2009

Я сообщил о проблеме на веб-сайте Microsoft. Они признали ошибку и сказали, что исправили ее в следующей версии.

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=435483

1 голос
/ 24 апреля 2009

Ваш код отлично работает в режиме отладки / выпуска на моем VS2005. Я отключил предварительно скомпилированные заголовки и использую многопоточную версию DLL библиотеки времени выполнения.

Проверено с VS2008 SP1 на компьютере с Vista (без предварительно скомпилированных заголовков, многопоточная DLL). Работает просто отлично.

Проверьте вашу установку.

...