C++ - 矢量<class>和标准::bad_alloc

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

本文关键字:标准 alloc bad class 矢量 lt C++ gt      更新时间:2023-10-16

我正在努力将一个程序从 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循环的条件,因此如果您在向量末尾添加一个新元素,它将增长 1,因此在下一次迭代中,计数器i将无法到达它。它应该是这样的:

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

但正如 rahnema1 在评论中所说,你不需要这样做。您可以使用同一元素的 z 个副本创建矢量,而无需复制它们:

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

另外,由于您已将问题标记为"c ++ 11",因此让我再提出另一个建议:按值返回向量,编译器将避免复制。

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));
}