百度结果如下:
运行库的链接可能会导致内存越界
msvcrt.lib,可能会导致内存越界,因为动态链接的库和静态链接的库可能会重载了new运算符,导致了不同的堆存在,可能会在一个堆上申请的空间在另一个堆上释放!
这里有两点需要注意:
尽量不要混合静态链接和动态链接,因为他们会申请不同的堆。
注意任何编译的警告,[warning LNK4098: 默认库“msvcrtd.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library]
原因:
为了只使用一个dll生成时链接了静态库,
创建了一个ocr类,比如写一个函数void readimg(){imshow(“path”);}也会直接报错,
会直接导致如下报错:
报错:
cmake+vs2015编译opencv后链接opencv静态库至dll,生成一个ocr类实现识别数字功能,但是仅仅实例化ocr之后,return后花括号}会报内存越界:注:没有用到任何memloc new之类的分配,全部为opencv自动管理
debug下:
Run-Time Check Failure #2 - Stack around the variable 'read' was corrupted.
release下:
Unhandled exception at 0x002012B8 in testdll_1.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.
跳转至:
#elif defined _M_IX86 || defined _M_X64
__declspec(noreturn) void __cdecl __report_gsfailure(GSFAILURE_PARAMETER)
{
if (IsProcessorFeaturePresent(PF_FASTFAIL_AVAILABLE))
{
__fastfail(FAST_FAIL_STACK_COOKIE_CHECK_FAILURE);
}