问题1:内存分配不足
运行opencv时会出现内存分配不足的情况:如下图所示
OpenCV Error: Insufficient memory (Failed to allocate ……. )
一般也会伴随着错误提示:Unhandled exception at at 0x76D85B68 in DEVISIGN_read.exe: Microsoft C++ exception: cv::Exception at memory location 0x0098EDDC.
开始想自己电脑32G内存,打开任务管理器,内存使用率还不到20%,很不理解为什么出现这个内存不足以分配的问题。经过查找资料,发现VS的配置是32位,VS分配是有限制的。那么一次性最多分类4GB内存,当需要不断分配内存很多时(处理视频),可能就不足了。这个时候将VS的opencv重新配置为64位的,就可以解决内存分配不足的问题了。
问题2:错误 14 error C2589: “(”:“::”右边的非法标记 和 错误 15 error C2059: 语法错误:“::”
1.错误代码:
const size_t key_size_upper_bound = std::min(sizeof(BucketKey) * CHAR_BIT + 1, sizeof(size_t) * CHAR_BIT);
2.错误原因分析:
std::min()的原意是找到std标准库(C++定义的标准库)中min的函数模板
// TEMPLATE FUNCTION min
template<class _Ty> inline
_Post_equal_to_(_Right < _Left ? _Right : _Left)
const _Ty& (min)(const _Ty& _Left, const _Ty& _Right)
{ // return smaller of _Left and _Right
return (_DEBUG_LT(_Right, _Left) ? _Right : _Left);
}
但由于全局的宏的存在,优先级比作用域操作符::高,发生冲突,会使用min的宏定义:
#define min(a,b) (((a) < (b)) ? (a) : (b))
如果使用宏定义,那么前面的作用域操作符::就使用错误了,出现以上的语法错误。
3.解决方案
消除歧义,将min指向std下的函数模板就可以。
第一种解决方案:给std::min加上括号(std::min),与min宏定义区分开.
第二种解决方案(限于使用VS开发),设置项目属性为不适用min宏定义,操作如下:
项目属性 ——> C/C++ ——> 预处理器 ——> 预处理器定义 (此处添加预定义编译开关 NOMINMAX)