我正在研究一个非常棘手的问题,我现在已经持续了一个星期了。我撞到了一堵非常坚硬的墙壁,我的额头因敲打而受伤,所以我希望有人可以帮助我。
我正在使用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
答案 0 :(得分:8)
哎呀!解决方案已经找到了。
在我们的解决方案中,我们已经定义了_SECURE_SCL = 0,但是在我们构建的第三方库中,这是未定义的(这意味着= 1)。将_SECURE_SCL设置为0可能会大大减少运行时间,但必须在所有包含的库中完成相同的操作,否则它们会以不同的方式处理数组大小。
http://msdn.microsoft.com/en-us/library/aa985896%28v=vs.80%29.aspx
这是一个有趣的一周。
答案 1 :(得分:6)
STL类与vector&lt;&gt;一样,在发布和调试版本之间存在布局不匹配,这是由迭代器调试支持引起的。您的问题的行为与您在应用程序的发布版本中链接.lib或DLL的调试版本并在它们之间交换STL对象时遇到的麻烦完全相同。结果是堆损坏和访问冲突异常。
三重检查您的构建设置,并确保您只链接Release版本中.libs的发布版本和Debug版本中.libs的调试版本。
答案 2 :(得分:0)
void Foo()
{
std::vector<int> blah;
blah.reserve(5);
blah.begin();
}