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)
。这里有未定义的行为?
答案 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将在异常时将您带到源代码位置。
然后,另一条通用建议是生成一些调试输出并将代码剖析成片段,以将问题隔离到特定的小代码片段。
特别是,如果你怀疑破坏运行不正确,那么也许你正试图在某个地方使用已删除的内存,并解决问题,你可能不想释放延长其生命周期的内存块并造成内存泄漏:具体之前销毁之后使用的块将从那里正确使用,您的应用程序将停止崩溃。您将能够找出与崩溃有关的障碍。