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

标签 c++ matlab opencv c++11

我正在将一个程序从 matlab 代码翻译成 C++,我必须在 Linux 上使用 opencv 库(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

我不知道确切原因,但我正在考虑一些内存泄漏.. 有没有更好的(和有效的)方法来做到这一点?

最佳答案

在 C++ 中,for 循环的条件在每次迭代中都会被评估,因此如果您在 vector 末尾添加一个新元素,它会增长 1,因此在下一次迭代中counter i 不会到达它。它应该是这样的:

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

但正如 rahnema1 在评论中所说,您不需要那样做。您可以使用相同元素的 z 个拷贝创建一个 vector ,而无需复制它们:

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

此外,因为您已将您的问题标记为“c++11”,所以让我提出另一个额外的建议:按值返回 vector ,编译器将避免复制。

std::vector <cv::Mat> repeat(cv::Mat img, uint32_t nx, uint32_t ny, uint32_t z)
{
    return std::vector<cv::Mat>(z, cv::repeat(img, nx, ny));
}

关于C++ - vector <class> 和 std::bad_alloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41545588/

相关文章:

java - opencv Mat 对象

c++ - OpenCV C++ 多线程加速

performance - 如何降低 O(N^2) C-index 函数的时间复杂度?

Matlab:通过逻辑索引进行多重赋值

matlab - 如何在 Matlab 中绘制圆?

python - findContour() 检测意外的内部边缘并为它们计算区域 OpenCV python

c++ - opencv:将 cout 与 Mat 对象一起使用抛出异常

c++ - 使 boost::python 尊重数据对齐

c++ - 与二维数组中的 .bmp 的简单碰撞?

c++ - 检查 CUDA 内核中的 device_vector 不起作用