10

我正在研究一个相当棘手的问题,我已经研究了一周。我撞到了一堵非常硬的墙,我的前额因撞到它而受伤,所以我希望有人能帮助我。

我正在为这个项目使用 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) 并将内联函数扩展设置为 Only __inline (/Ob1),即使代码位于 cpp 文件中,它也可以工作。

当然,如果我们回到未删减的应用程序并自行更改那些编译器选项,它就会崩溃。

如果有人对此有任何见解,请告诉我。

谢谢,里龙

4

3 回答 3

8

啊!解决方案想通了。

在我们的解决方案中,我们定义了 _SECURE_SCL = 0,但在我们构建的第 3 方库中,这是未定义的(这意味着 = 1)。将 _SECURE_SCL 设置为 0 可能会大大减少运行时间,但必须在所有包含的库中执行相同的操作,否则它们会以不同的方式处理数组大小。

http://msdn.microsoft.com/en-us/library/aa985896%28v=vs.80%29.aspx

那是一个有趣的一周。

于 2011-03-03T17:45:58.593 回答
6

STL 类,如 vector<>,在发布版本和调试版本之间存在布局不匹配,这是由迭代器调试支持引起的。您的问题的行为与您在应用程序的发布版本中链接 .lib 或 DLL 的调试版本并在它们之间交换 STL 对象时遇到的问题完全一样。结果是堆损坏和访问冲突异常。

三重检查您的构建设置,并确保您只在您的发布版本中链接 .libs 的发布版本和在您的调试版本中的 .libs 的调试版本。

于 2011-03-03T00:58:19.540 回答
0

你能试试:

void Foo()  
{  
    std::vector<int> blah;
    blah.reserve(5);
    blah.begin();  
} 
于 2011-03-03T01:17:00.523 回答