统一初始化导致 C++ 运行时错误
Uniform initialization causes runtime error in C++
我是统一初始化的忠实拥护者,在大多数情况下,当我想构造初始化变量时,我都会使用它。最近,我在构造 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 上关于统一初始化 "uniformity" 的演讲非常精彩:https://www.youtube.com/watch?v=7DTlWPgX6zs
用{...}
构造对象调用"list-initialization".
cv::Mat
提供了一个采用 std::initializer_list
的构造函数:
https://github.com/opencv/opencv/blob/master/modules/core/include/opencv2/core/mat.hpp#L1007
在重载决议中有一个special rule,总是优先考虑采用std::initializer_list
的构造函数,如果list-initialization被使用,不管是否存在其他可能需要较少隐式转换的构造函数。
调用cv::Mat(...)
与cv::Mat{...}
完全不同。
我对此的心理模型是:如果您正在构建的对象是一个容器,那么 {...}
的行为可能与 (...)
不同,因此您应该小心。否则,更喜欢 {...}
.
我是统一初始化的忠实拥护者,在大多数情况下,当我想构造初始化变量时,我都会使用它。最近,我在构造 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 上关于统一初始化 "uniformity" 的演讲非常精彩:https://www.youtube.com/watch?v=7DTlWPgX6zs
用{...}
构造对象调用"list-initialization".
cv::Mat
提供了一个采用 std::initializer_list
的构造函数:
https://github.com/opencv/opencv/blob/master/modules/core/include/opencv2/core/mat.hpp#L1007
在重载决议中有一个special rule,总是优先考虑采用std::initializer_list
的构造函数,如果list-initialization被使用,不管是否存在其他可能需要较少隐式转换的构造函数。
调用cv::Mat(...)
与cv::Mat{...}
完全不同。
我对此的心理模型是:如果您正在构建的对象是一个容器,那么 {...}
的行为可能与 (...)
不同,因此您应该小心。否则,更喜欢 {...}
.