【opencv】debug报错HEAP CORRUPTION DETECTED

运行至第一句涉及矩阵运算的代码(如cv::multiply)时报错
【opencv】debug报错HEAP CORRUPTION DETECTED_第1张图片

HEAP CORRUPTION DETECTED: after Normal block (#45034) at 0x000001BDC586F0E0.
CRT detected that the application wrote to memory after end of heap buffer.

release下不会报错,只有debug下会报错

版本:opencv 3.1.0 vc2013 x64

不管是官方编译的版本还是自己编译(非本机编译)的版本,都会报错。进一步的,在自己编译的版本下看调用堆栈
【opencv】debug报错HEAP CORRUPTION DETECTED_第2张图片
一层层往上找:
std::allocator<>::deallocate,c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0
std::vector<>::~vector,c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\vector
cv::ocl::selectOpenCLDevice,opencv\sources\modules\core\src\ocl.cpp
【opencv】debug报错HEAP CORRUPTION DETECTED_第3张图片
挂在了selectOpenCLDevice的返回时std::vector析构的地方,此处是找到tempStrDeviceType="gpu"类型的设备了,devices不为空,其类型为std::vector devices,其中struct _cl_device_id { int dummy; };
看到源码里有一句注释Use clReleaseDevice to cleanup,是不是opencl的设备没有显式释放导致的?

放到另外一台机器上运行,一切正常,说明可能是跟机器相关。
本机(出问题的机器)配置是win11 + i5 13500HX + RTX 4050 laptop,正常运行的机器配置是win10 + i7 9700 + GTX 1660Ti

怀疑是opencv3.1.0的opencl代码太老旧在新设备上无法正常debug运行,是否是40系n卡的问题?

编译了opencv3.4.16,debug不会报错了

尝试在本机重新编译opencv3.1.0,之前的是官方编译的版本。结果重新编译就不会报错了,说明不是源码的问题,可能是cpu、核显gpu、独显gpu变化太大导致不兼容。查了下,好像就cpu的指令集有不同,13500HX
【opencv】debug报错HEAP CORRUPTION DETECTED_第4张图片
跟opencv3.1.0发布同期的cpu,挑了i7 770HQ
【opencv】debug报错HEAP CORRUPTION DETECTED_第5张图片
新cpu少了一个AES-NI

暂时不清楚具体原因

你可能感兴趣的:(opencv,opencv)