Сбой при запуске приложения из-за существования неисполненного кода в исходном файле - С++

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

Я использую 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();  
}