我得到一些我不明白的奇怪的行为,也许我只是遗漏了一些明显的东西。我希望有人可以解释一下。
以下是导致问题的一些代码:
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
// draw line from point to point along the point "list"
void drawLineSegments(Mat img, vector<Point> points, Scalar colour = Scalar(255,255,255)){
for (int i = 0; i < (points.size()-1); i ++){
line(img,points[i],points[i+1], colour);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Mat testImg = Mat(100,100,CV_8U,0.0); // test black image, not important
vector<Point> testPoints; // new vector
drawLineSegments(testImg,testPoints); // try to draw it, expect function to do nothing because size should be 0
return 0;
}
这会编译但在运行时出现错误&#34;向量下标超出范围&#34;,通过调试我可以看到它是因为for循环运行。为什么for循环运行?这是我不明白的。
调用testPoints.size()似乎返回0并且如果我将绘制函数更改为:
// draw line from point to point along the point "list"
void drawLineSegments(Mat img, vector<Point> points, Scalar colour = Scalar(255,255,255)){
int lengthMinusOne = points.size()-1;
for (int i = 0; i < lengthMinusOne; i ++){
line(img,points[i],points[i+1], colour);
}
}
然后它有效。那么为什么我不能直接在条件中使用points.size()?
答案 0 :(得分:4)
这条线是罪魁祸首。
for (int i = 0; i < (points.size()-1); i ++){
具体而言,(points.size()-1)
这相当于说:
size_t s = points.size(); // Which is zero for you use case.
s = s - 1; // This is not -1. It's large positive number.
for (int i = 0; i < s; i ++){
从s != -1
开始,您将在for
循环中输入代码块并从points
访问成员,这会导致未定义的行为。
答案 1 :(得分:2)
你应该看到有关签名/无符号比较的警告(for循环有缺陷)。
答案 2 :(得分:1)
size()返回一个size_t,它是无符号的,从零减去1会导致下溢。当您对int进行分配时,它会在循环中将其正确设置为-1,从而有效地将UINT_MAX与i进行比较。