2011-03-03 47 views
10

我正在处理一个非常棘手的问题,我现在已经坚持了一个星期。我打了一面非常坚硬的墙壁,额头因撞击而受伤,所以我希望有人能帮助我。由于源文件中存在未执行代码而导致运行应用程序时发生崩溃 - C++

我正在使用Visual Studio 2005进行此项目 - 我已安装2008,但在尝试使用时遇到类似问题。

我们有一个应用程序目前正在对OpenCv1.1进行编译,我试图将它更新到2.2。当我们将静态链接切换到新的库时,应用程序崩溃 - 但仅在发布模式下。所以动态链接和调试都可以正常工作。调用push_back

崩溃是std::vector

然后我想到了它运行的一些基本代码在OpenCV中的正常工作,然后把该完全相同的代码,并把它添加到我们的应用程序的样本测试应用程序。该代码失败。

然后我去内脏的应用程序,它并没有实例除了主界面和1类称为代码的任何代码的对象,它仍然坠毁。但是,如果我直接在主GUI中运行该代码,则它工作正常。

我便开始注释掉的应用程序的大量(在不应该被实例化的组件),并最终我的工作我的方式下来下来下来,直到......

我有了一个方法的类

void Foo() 
{ 
    std::vector<int> blah; 
    blah.begin(); 
} 

如果此方法是在报头中定义,测试代码的工作,但如果这个代码在CPP文件中定义,它崩溃。另外,如果我使用std::vector<double>而不是int,它也可以。

然后我试着玩编译器选项,如果我关闭了优化(/ Od)并将内联函数扩展设置为仅__inline(/ Ob1),即使代码位于cpp文件中也可以工作。

当然,如果我们回到ungutted应用程序,并通过自己改变这些编译器选项,它崩溃。

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

谢谢, Liron

+0

当你使用调试器完成它时,程序能够完全加载或在它到达main(或WinMain)之前崩溃吗?你的问题很有趣,因为通常我发现动态链接比静态链接到运行时更有问题 – greatwolf 2011-03-03 00:53:16

+0

程序完全加载正常。然后我在(Qt)gui上按下一个按钮,运行代码调用opencv。如果代码是正确的在按钮按下它的作品,但如果代码从另一个类中调用,它会崩溃。 – Liron 2011-03-03 01:17:30

+0

我更新了项目,根本不创建gui,一旦我调用opencv代码,它仍然崩溃。 – Liron 2011-03-03 02:08:09

回答

8

哎呀!解决方案想通了。

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

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

这是一个有趣的一周。

6

STL类,像载体<>具有释放之间的布局失配和调试生成,由迭代调试支持。您的问题的行为完全像您在应用程序的发行版本中链接.lib或DLL的调试版本时所遇到的那种麻烦,并在它们之间交换STL对象。结果是堆损坏和访问冲突异常。

三重检查您的构建设置,并确保你永远只能链接的.libs的发行版本在发布版本,并在你的调试版本的.libs的调试版本。

+0

+1。只需添加一种可能性:将静态链接的DLL/EXE与动态链接的动态链接混合,然后传递指针而不用携带信息如何正确销毁。 – 0xC0000022L 2011-03-03 01:23:28

+0

我们应该动态地做所有事情。 – Liron 2011-03-03 02:04:03

+0

我们包含的库包括: Imm32.lib QtCore.lib QtGui.lib QtMain.lib QtNetwork.lib QtOpenGL.lib QtXml.lib Vfw32.lib WinMM.lib comctl32.lib glu32.lib libjasper.lib libjpeg.lib libpng的.lib libtiff.lib opencv_calib3d220.lib opencv_contrib220.lib opencv_core220.lib opencv_features2d220.lib opencv_ffmpeg220.lib opencv_flann220.lib opencv_gpu220.lib opencv_haartraining_engine.lib opencv_highgui220.lib opencv_imgproc220.lib opencv_lapack.lib opencv_legacy220.lib opencv_ml220.lib opencv_objdetect220.lib opencv_video220.lib ws2_32.lib qjpeg.lib 此外,我们正在链接增强,它应该处理这个 – Liron 2011-03-03 02:04:30

0

可以尝试:

void Foo() 
{ 
    std::vector<int> blah; 
    blah.reserve(5); 
    blah.begin(); 
} 
+0

添加储备(5)没有区别。仍然崩溃。无论如何,该函数中的代码永远不会执行(至少调试器不会触发它)。 – Liron 2011-03-03 01:22:51

+0

@LKIM然后尝试std :: vector blah(5); – fazo 2011-03-03 01:37:27

+0

我们曾经有过 - 仍然导致崩溃: - \。上面的代码只是让我可以把崩溃降低到我能做到的最小,但那曾经是做了很多功能的一部分。 – Liron 2011-03-03 03:49:44

相关问题