c++ - 统一初始化导致 C++ 运行时错误

标签 c++ opencv uniform-initialization

我是统一初始化的忠实拥护者,在大多数情况下,当我想构造已初始化的变量时,我都会使用它。最近,我在构造 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(): invalid chunk size

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

最佳答案

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 个参数。这意味着您有一个包含元素 { 1, 256, CV_8U } 的矩阵,而不是 256 个元素的矩阵。

Nicolai Josuttis 在 CppCon2018 上关于统一初始化的“一致性”的演讲非常精彩:https://www.youtube.com/watch?v=7DTlWPgX6zs

关于c++ - 统一初始化导致 C++ 运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53727612/

相关文章:

c++ - Qt Designer .ui 和 Visual Studio 事件处理

c++ - 使用 g++ 编译,使用 vector 和数组库

c++ - C++11 统一初始化语法

c++ - Qt Creator C++,为状态栏添加许多标签

c++ - 令 iter 为 std::iterator。 std::next(iter,1) 和++iter 之间有什么区别吗?

c++ - 如何在 C++ 中保留 opencv 中的最后一帧

opencv - 在OpenCV中打开一个巨大的图像(约1.5GB)

python - 如何使用 opencv 计算 2 个 numpy 数组的 "EMD",即 "histogram"?

c++ - C++ 中的对象初始化语法( T obj = {...} 与 T obj{...} )