C ++ - vector <class>和std :: bad_alloc

时间:2017-01-09 10:14:19

标签: c++ matlab opencv c++11

我正在努力将程序从matlab代码转换为C ++,我必须在Linux上使用opencv libs(gcc版本4.9.2)

所以我试图翻译这行matlab代码:

repeatedMat = repmat(originalMat,[1 1 k]); 

我写的最后一个代码是:

void repeat(cv::Mat img, std::vector <cv::Mat> &output, uint32_t nx, uint32_t ny, uint32_t z)
{
    cv::Mat tmpMat = cv::repeat(img, nx, ny);
    output = std::vector <Mat> (z);

    for (uint32_t i = 0; i < output.size(); i++)
        output.insert(output.end(), tmpMat);
}

问题是我总是遇到 std :: bad_alloc 错误

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted

我不确切知道为什么,但我在想一些内存泄漏.. 有没有更好的(和工作)方式来做到这一点?

1 个答案:

答案 0 :(得分:2)

在C ++中,for循环的条件在每次迭代中都会被计算,因此如果在向量的末尾添加一个新元素,它会增长1,所以在下一次迭代中,计数器{{ 1}}无法达到它。它应该是这样的:

i

但正如rahnema1在评论中所说,你不需要这样做。您可以创建一个包含相同元素的for (uint32_t i = 0; i < z; i++) output.insert(output.end(), tmpMat); 个副本的向量,而无需复制它们:

z

另外,因为您已将问题标记为&#34; c ++ 11&#34;,请再提一个其他建议:按值返回向量,编译器将避免复制。

output = std::vector <Mat> (z, tmpMat);