统一初始化导致C ++中的运行时错误

科奇卡

我是统一初始化的忠实拥护者,在大多数情况下,当我要构造初始化变量时,都会使用它。最近,在构造type变量时遇到了奇怪的错误cv::Mat

cv::Mat lookUpTable( 1, 256, CV_8U );
uchar* p = lookUpTable.ptr();

for( int i = 0; i < 256; ++i )
{
    p[i] = cv::saturate_cast<uchar>( pow( i / 255.0, gamma ) * 255.0 );
}

虽然此实现效果很好,但是如果使用统一初始化

cv::Mat lookUpTable{ 1, 256, CV_8U };

出现以下错误

malloc_consolidate():无效的块大小

我仍然不太确定会发生什么。是否使用了不同的构造函数(超出预期)?有人可以进一步解释吗?

内森·奥利弗

cv::Mat lookUpTable{ 1, 256, CV_8U }调用的构造函数不同于cv::Mat lookUpTable( 1, 256, CV_8U )cv::Mat lookUpTable{ 1, 256, CV_8U }直接列表初始化,并且由于cv::Mat有一个接受的std::initlizer_list构造函数,因此将调用该构造函数,而不是第一个调用的3参数。这意味着您有一个包含elements的矩阵{ 1, 256, CV_8U },而不是256个element的矩阵。

Nicolai Josuttis在CppCon2018上对统一初始化的“均匀性”进行了非常好的演讲:https : //www.youtube.com/watch?v= 7DTlWPgX6zs

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章