zoukankan      html  css  js  c++  java
  • 如何解决vector 析构函数的异常 opencv Assert _CrtIsValidHeapPointer

    一气呵成代码,但是,当发生执行_CrtIsValidHeapPointer例外,去搭调了一上午Bug。最终获得


    跟踪定位到 _CrtIsValidHeapPointer ,注意到 g 8h"@dbgheap.c 文件里 _CrtIsValidHeapPointer 处凝视:


             /*
             * If this ASSERT fails, a bad pointer has been passed in. It may be
             * totally bogus, or it may have been allocated from another heap.
             * The pointer MUST come from the 'local' heap.
             */


             _ASSERTE(_CrtIsValidHeapPointer(pUserData));


      大概是由于 dll 假设静态链接了执行时库,dll 就会拥有独立于应用程序堆(也称作local heap)的执行时堆实例。此时在 dll 外部就不能訪问此 local heap,所以也就有上面所出现的异常啦。MSDN 中也有介绍:


      The _CrtIsValidHeapPointer function is used to ensure that a specific memory address is within the local heap. The local heap refers to the heap created and managed by a particular instance of the C run-time library. If a dynamic-link library (DLL) contains a static link to the run-time library, it has its own instance of the run-time heap, and therefore its own heap, independent of the application's local heap. When _DEBUG is not defined, calls to _CrtIsValidHeapPointer are removed during preprocessing.



    程序崩溃在当析构一个带有vector成员函数对象的时候,在析构vector时,会出现这个错误,大致原因是由于析构的时候找不到vector分配的空间

    一行一行查看代码发现,对象里面的points2, status等vector变量是在calcOpticalFlowPyrLK(img1, img2, points1, points2, status, similarity, window_size, level, term_criteria, lambda, 0); 函数中分配的,即opencv的dll,所以当对象进行析构的时候,由于不能訪问此local heap所以会有异常崩溃。



    解决方法:

    在调用opencv的函数之前,自己进行空间的分配



    另一种可能是由于VS版本号和opencv使用的版本号不一致创建,同hog当检测行人,这似乎是问题

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    核函数基础一简单解释
    矩阵的基本性质 之 正规矩阵,矩阵的迹,行列式,伴随矩阵,矩阵的逆,对角矩阵,矩阵求导
    矩阵的基本性质 之 对称矩阵,Hermite矩阵,正交矩阵,酉矩阵
    矩阵的基本性质 之 矩阵加减法,数乘,乘法,转置
    机器学习实战基础(二十七):sklearn中的降维算法PCA和SVD(八)PCA对手写数字数据集的降维
    拉格朗日对偶性
    批处理符号2
    批处理符号1
    set命令
    goto命令
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4752294.html
Copyright © 2011-2022 走看看