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

koc*_*ica 3 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 );
}
Run Code Online (Sandbox Code Playgroud)

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

cv::Mat lookUpTable{ 1, 256, CV_8U };
Run Code Online (Sandbox Code Playgroud)

出现以下错误

malloc_consolidate():块大小无效

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

Nat*_*ica 8

cv::Mat lookUpTable{ 1, 256, CV_8U }调用不同的构造函数cv::Mat lookUpTable( 1, 256, CV_8U ). cv::Mat lookUpTable{ 1, 256, CV_8U }直接列表初始化,因为cv::Mat有一个接受a的std::initlizer_list构造函数,将调用该构造函数而不是第一个调用所做的3参数.这意味着您有一个包含元素的矩阵{ 1, 256, CV_8U },而不是256个元素矩阵.

Nicolai Josuttis在CppCon2018上就统一初始化的"统一性"进行了非常好的讨论:https://www.youtube.com/watch?v = 7DTlWPgX6zs


Vit*_*meo 6

使用{...}构造一个对象被称为“列表初始化”

cv::Mat提供了一个构造函数std::initializer_listhttps : //github.com/opencv/opencv/blob/master/modules/core/include/opencv2/core/mat.hpp#L1007

重载决议中有一个特殊规则,如果使用列表初始化,则始终优先考虑采用的构造函数,而不管是否存在可能需要较少隐式转换的其他构造函数。std::initializer_list

调用cv::Mat(...)cv::Mat{...}.


我对此的心理模型是:如果您正在构建的对象是一个容器,则其{...}行为可能与 不同(...),因此您应该小心。否则,更喜欢{...}.