1

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). 这里有未定义的行为?

4

2 回答 2

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];
于 2013-05-21T11:20:55.560 回答
1

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

您的代码中有问题,最终会给您在运行时带来麻烦,但仅在特定情况下。这可能不是那么明显,例如有和没有调试器的不同执行时间以及随之而来的线程竞争条件。

您仍然想快速找出崩溃(尤其是访问冲突)位置。如果 Windows 向您显示一个指示崩溃进程的窗口并带有调试选项,您希望附加调试器以查看问题所在的位置。即使在一系列问题中,崩溃本身也可能不是第一个,但从那里进行故障排除已经为时已晚。

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

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

特别是,如果您怀疑破坏运行不正确,那么您可能正试图在某处使用已删除的内存,并且为了解决问题,您可能不想释放内存块以延长它们的生命周期并造成内存泄漏:使用后的特定块早期的破坏将从那里正确使用,您的应用程序将停止崩溃。您将能够找出崩溃与哪个块有关。

于 2013-05-21T12:15:00.407 回答