循环条件下的空向量<point> size()会导致奇怪的行为</point>

时间:2014-05-02 16:39:32

标签: c++ opencv

我得到一些我不明白的奇怪的行为,也许我只是遗漏了一些明显的东西。我希望有人可以解释一下。

以下是导致问题的一些代码:

#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()?

3 个答案:

答案 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进行比较。