gpt4 book ai didi

C++ - vector 和 std::bad_alloc

转载 作者:行者123 更新时间:2023-11-28 01:54:59 40 4
gpt4 key购买 nike

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

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com