我正在将一个程序从 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/