Exe二进制文件仅在IDE外部崩溃

时间:2013-05-20 09:46:47

标签: c++ opencv

OpenCV1.0项目大量使用cvBlob结构(函数参数,blob列表等)。

struct CvBlob{
    float   x,y,w,h;
    int     ID; }

我在vc9项目中添加了一些成功的成员,直到我发现二进制文件无法在发布模式下在IDE外部运行。它在某个地方发生破坏时会崩溃(在项目内部执行时不会崩溃)。

新结构:

struct CvBlob{
    float   x,y,w,h;
    int     ID,myint; //Works fine.
    double* mydouble; //Crushes only outside visual studio.
}

在rutime期间,mydouble用作数组:

blob.mydouble=new double [10];

在深入研究大型源代码之前,有什么通用建议吗?

编辑:调试在IDE外成功运行。

EDIT2: CvSeq用作主要blob列表容器:cvSeqPush(CvSeq*,CvBlob*)cvSeqRemove(CvSeq*,int)。这里有未定义的行为?

2 个答案:

答案 0 :(得分:2)

您是否应该能够扩展CvBlob结构,然后添加自己的构造函数和析构函数来管理myDouble的内存?

  struct MyCvBlob : CvBlob {
       double* myDouble;
       // initialize myDouble to NULL in constructor
       MyCvBlob() {
          myDouble = NULL;
       }
       // free the memory pointed to by myDouble if in use
       virtual ~MyCvBlob() {
          if(myDouble) {
             delete [] myDouble;
          }
       }
  };

  MyCvBlob blob;
  blob.myDouble = new double[10];

答案 1 :(得分:1)

  

在深入研究大型源代码之前,有什么通用建议吗?

您的代码中存在错误,这最终会给您带来运行时的麻烦,但仅限于某些情况。哪个可能不那么明显,例如有和没有调试器和随后的线程竞争条件的不同执行时序。

你还想快速找到的东西是崩溃(尤其是访问冲突)的位置。如果Windows显示一个窗口,指示具有调试选项的崩溃过程,您希望附加调试器可能会看到问题的位置。即使在一系列问题中,崩溃本身可能不是第一次,但是从那里开始排除故障已经很晚了。

另一种方法是附加一个轻量级调试器,与全功能IDE调试器相比,其开销较小。例如,您可以附加LogProcessExceptions应用程序,并为您的应用程序上发生的每个异常编写一个minidump文件。稍后,.DMP文件可以由Visual Studio追溯打开,IDE将在异常时将您带到源代码位置。

然后,另一条通用建议是生成一些调试输出并将代码剖析成片段,以将问题隔离到特定的小代码片段。

特别是,如果你怀疑破坏运行不正确,那么也许你正试图在某个地方使用已删除的内存,并解决问题,你可能不想释放延长其生命周期的内存块并造成内存泄漏:具体之前销毁之后使用的块将从那里正确使用,您的应用程序将停止崩溃。您将能够找出与崩溃有关的障碍。