Векторная коррупция STL в проектах VS - PullRequest
4 голосов
/ 03 марта 2010

У меня есть решение Visual Studio 2005 с несколькими проектами, которые создаются независимо друг от друга. Основной проект статически связывает другие проекты. Я получаю очень странное векторное повреждение STL в одной из этих статически связанных библиотек. Например, я объявляю std :: vector и затем выполняю sort( thatVector.begin(), thatVector.end() ), но когда я отлаживаю его и смотрю на разборку, я вижу это:

std::vector<SomeOtherClass<SomeOtherTemplateType>,std::allocator<SomeOtherClass<SomeOtherTemplateType> > >::begin

Невероятно странно, что SomeOtherClass и SomeOtherTemplate объявлены в основном проекте, поэтому эта библиотека не должна иметь о них абсолютно никаких знаний.

Я пытался заморозить все остальные потоки, думая, что, возможно, один из них портит thatVector, но без кубиков. Я в полной растерянности. Кто-нибудь испытывал что-то подобное?

Информация о компиляции: - основная программа / Zi, пользовательская оптимизация (в основном отладочная версия сборки) - статическая библиотека / Zi, / Od

Информация о ссылке: / DEBUG

Ответы [ 2 ]

5 голосов
/ 03 марта 2010

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

0 голосов
/ 03 марта 2010

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

В этом случае полный тип вашего вектора:

std::vector<SomeOtherClass<SomeOtherTemplateType>,std::allocator<SomeOtherClass<SomeOtherTemplateType> > >

... что, вероятно, объявлено в вашем коде примерно так:

vector<SomeOtherClass<SomeOtherTemplateType> > thatVector;

... с распределителем, разрешающим аргумент шаблона по умолчанию.

Теперь перейдем к вашей проблеме коррупции. Существует не так много информации о природе коррупции, поэтому я собираюсь сделать несколько предположений. Иными словами, вы выделяете вектор в одном модуле и пытаетесь что-то с ним сделать (например, push_back в нем) в другом модуле, и это происходит, когда вы что-то делаете в другом модуле, когда действительно происходит повреждение. К сожалению, во многих из этих случаев коррупция не обнаруживается и не регистрируется в тот момент, когда происходит коррупция. Это часто обнаруживается намного позже в совершенно не связанном коде.

Если приведенные выше предположения верны, у меня есть 2 предложения относительно возможной причины:

  1. Модули не связаны с одной и той же версией и разновидностью библиотек времени выполнения. Попробуйте убедиться, что каждый модуль ссылается на один и тот же CRT (например, многопоточная DLL-библиотека отладки под Windows) и повторите попытку. В большинстве случаев это проблема.

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

...