为啥这个程序崩溃
Posted
技术标签:
【中文标题】为啥这个程序崩溃【英文标题】:why this program is crashing为什么这个程序崩溃 【发布时间】:2013-08-05 09:42:22 【问题描述】:我写了一个小程序,我想根据一个向量将一帧的值设置为255:
result = cv::Mat::zeros(frame.size(),CV_8UC1);
std::vector<cv::Point2f> imageCorners;
.......................................................
for ( int i = 0 ; imageCorners.size();i++)
std::cout << imageCorners[i]<< std::endl;
result.at<uchar>(imageCorners[i]) = 255;
cv::imshow("result",result);
我的问题是:为什么程序在完成循环后就崩溃了?即使我看到结果是正确的?我得到的错误信息是:
vector subscript out of range
【问题讨论】:
【参考方案1】:for ( int i = 0 ; imageCorners.size();i++)
// ^^^^^^^^^^^^^^^^^^^
下划线部分是条件。在这种情况下,您说的是“继续循环直到imageCorners
的大小为“假”(即0
)”。但是你永远不会改变向量的大小,所以这个条件永远不会停止循环,i
会不断变大,直到你尝试访问实际上不在imageCorners
中的索引。
大概你的意思是循环直到i
变得比向量大。然后使用
for (int i=0; i < imageCorners.size(); ++i)
【讨论】:
【参考方案2】:这对我来说看起来很狡猾:
for ( int i = 0 ; imageCorners.size();i++)
你肯定想写这样的东西:
for ( int i = 0 ; i < imageCorners.size();i++)
【讨论】:
【参考方案3】:循环条件imageCorners.size()
仅产生存储在容器中的元素数量。只要您将一个元素放入imageCorners
,该语句将始终评估为true
。你要的是i < imageCorners.size()
。
【讨论】:
【参考方案4】:for ( int i = 0 ; imageCorners.size();i++)
如果 imageCorners.size() 不为 0,我认为这个循环将永远运行。所以当这个
std::cout << imageCorners[i]<< std::endl;
被执行,在某些时候i
会越界,程序会崩溃。
【讨论】:
以上是关于为啥这个程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章