迭代器偶尔出现分段故障
Occasionally Segmentation Fault with iterators
我目前正在做一个关于一个应用程序的项目,该应用程序能够从绘制的图像中创建一个可玩的游戏级别(可以在这里找到:Github)。为此,我使用openCV进行图像处理
我的问题是一个函数,它应该将检测到的线(即级别中的"墙")绘制到图像上。
void LineFinder::drawDetectedLines( cv::Scalar color)
{
for (auto it = Play::getInstance()->getFinder()->getLines().begin(); it != Play::getInstance()->getFinder()->getLines().end(); ++it)
{
// The lines are stored in an std::vector<cv::Vec4i>,
// so basically in a vector which contains vectors with 4 elements each
cv::Point pt1((*it)[0], (*it)[1]);
cv::Point pt2((*it)[2], (*it)[3]);
// draws a line from pt1 to pt2
cv::line(Play::getInstance()->getFinder()->getImage(), pt1, pt2, color);
++it;
}
}
当这个函数执行时,大多数时候我都会遇到分段错误,但有时它会起作用,结果正如我预期的那样。我知道向量包含元素
那么,你能想到这种行为的可能原因吗?
编辑:有趣的是,当使用这个函数的函数已经成功执行了一次时,我可以一次又一次地重新执行它,不会出现错误。
第二版:我仍然不知道为什么迭代器会出现分段错误,但如果没有它们,它会以某种方式工作:
void LineFinder::drawDetectedLines( cv::Scalar color)
{
for (int i = 0; i < Play::getInstance()->getFinder()->getLines().size(); ++i)
{
cv::Point pt1(Play::getInstance()->getFinder()->getLines()[i][0], Play::getInstance()->getFinder()->getLines()[i][1]);
cv::Point pt2(Play::getInstance()->getFinder()->getLines()[i][2], Play::getInstance()->getFinder()->getLines()[i][3]);
cv::line(Play::getInstance()->getFinder()->getImage(), pt1, pt2, color);
}
}
您将迭代器递增两次。这里一次:
for (auto it = Play::getInstance()->getFinder()->getLines().begin(); it != Play::getInstance()->getFinder()->getLines().end(); ++it)
这里有一次:
++it;
可能会发生递增超过end()
迭代器的情况,从而导致未定义的行为。
编辑:
你的帖子中没有足够的信息来识别其他问题,尤其是我不知道所有的变量和函数是什么。我也不想在整个git里爬来爬去。
因此,这里有一些可能的问题:
是否保证
Play::getInstance()->getFinder()->getLines()
始终返回对同一容器的引用?是否保证在迭代时不会修改返回的容器?
存储在容器中的对象是否保证是数组/向量/。。。至少有4个元素?
Edit2:
我看了一下你的存储库,在linefinder.cpp:中有错误
std::vector<cv::Vec4i> LineFinder::getLines()
{
return lines;
}
getLines()
不返回对同一容器的引用,而是在每次调用时返回一个副本。因此,在for循环中,您一直在比较一个容器的迭代器和另一容器的迭代器。将定义更改为引用返回:
std::vector<cv::Vec4i>& LineFinder::getLines()
{
return lines;
}
或者在构造迭代器之前保存返回:
auto lines = Play::getInstance()->getFinder()->getLines();
for (auto it = lines.begin(); it != lines.end(); ++it)
{
相关文章:
- 分段故障(堆芯转储)矢量
- 数组的指针从不分段故障
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 分段故障 运行C++代码时出现 SIGSEGV
- 分段故障背包问题
- 分段故障 11,从类函数显示动态 C 字符串
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 在C++中,当指向删除和指向不同对象时,分段故障指针
- 分段故障说明
- 分段故障(核心转储)-不知道为什么
- 分段故障线程
- hiredis SET遇到分段故障
- 分段故障,合并排序算法
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 到达主C++之前分段故障
- 分段故障核心使用 IF流转储
- 使用向量的移动键盘排列(分段故障)
- 在二进制树插入和遍历期间,我得到了分段故障
- 分段故障在类之间返回整数
- C++分段故障BST