由于源文件中存在未执行的代码而运行应用程序时崩溃 - c ++

时间:2011-03-03 00:45:12

标签: c++ visual-studio-2005 opencv std inline-functions

我正在研究一个非常棘手的问题,我现在已经持续了一个星期了。我撞到了一堵非常坚硬的墙壁,我的额头因敲打而受伤,所以我希望有人可以帮助我。

我正在使用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

3 个答案:

答案 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();  
}