Сбой при запуске приложения из-за существования неисполненного кода в исходном файле - С++
Я работаю над довольно сложной проблемой, с которой я работаю буквально неделю. Я ударил очень тяжелую стену, и мой лоб болит от удара, поэтому я надеюсь, что кто-то может мне помочь.
Я использую Visual Studio 2005 для этого проекта - у меня установлен 2008 год, но я сталкивался с подобными проблемами, когда я его пробовал.
У нас есть приложение, в настоящее время работающее с компиляцией с OpenCv1.1, и я пытаюсь обновить его до версии 2.2. Когда мы переключаем статически ссылку на новые библиотеки, приложение вылетает - но только в режиме деблокирования. Таким образом, динамическая компоновка и отладка отлично работают.
Сбой в std::vector
при вызове push_back
.
Затем я придумал пример тестового приложения, которое запускает некоторый базовый код в opencv, который отлично работает, а затем взял тот же самый код и добавил его в наше приложение. Этот код не работает.
Затем я потрошил приложение, чтобы он не создавал экземпляр каких-либо объектов кода, кроме основного gui и 1 класса, который вызывал этот код, и он все еще разбился. Однако, если я запустил этот код непосредственно в главном gui, он работал нормально.
Затем я начал комментировать огромные количества приложений (в компонентах, которые никогда не должны создаваться), и в итоге я работал вниз, пока...
У меня есть класс, который имеет метод
void Foo()
{
std::vector<int> blah;
blah.begin();
}
Если этот метод определен в заголовке, тестовый код работает, но если этот код определен в файле cpp, он сработает. Кроме того, если я использую std::vector<double>
вместо int, он также работает.
Затем я попытался воспроизвести параметры компилятора, и если у меня отключена оптимизация (/Od), а расширение встроенной функции установлено только на __inline (/Ob1), оно работает даже с кодом, находящимся в файле cpp.
Конечно, если мы вернемся к нераскрытому приложению и сами изменим эти параметры компилятора, он сработает.
Если кто-нибудь знает об этом, сообщите мне.
Спасибо,
Liron
Ответы
Ответ 1
ARGH! Решение выяснено.
В нашем решении мы определили _SECURE_SCL = 0, но в сборниках третьей стороны, которые мы построили, это было undefined (что означает = 1). Установка _SECURE_SCL на 0 якобы значительно сокращает время автономной работы, но она должна быть сделана одинаково для всех включенных библиотек, иначе они будут обрабатывать размеры массивов по-разному.
http://msdn.microsoft.com/en-us/library/aa985896%28v=vs.80%29.aspx
Это была веселая неделя.
Ответ 2
Классы STL, такие как vector < > , имеют несоответствие компоновки между версиями выпуска и отладки, вызванными поддержкой отладки итератора. Ваша проблема ведет себя точно так же, как проблема, с которой вы сталкиваетесь, когда вы связываете сборку debug.lib или DLL в сборке релизов вашего приложения и обмениваете объект STL между ними. Результатом являются повреждения кучи и нарушения прав доступа.
Тройная проверка ваших настроек сборки и убедитесь, что вы связываете только сборку релиза .libs в сборке Release и сборку debug.libs в вашей сборке Debug.
Ответ 3
Вы могли бы попробовать:
void Foo()
{
std::vector<int> blah;
blah.reserve(5);
blah.begin();
}