为啥这个程序崩溃

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 &lt; imageCorners.size()

【讨论】:

【参考方案4】:
for ( int i = 0 ; imageCorners.size();i++)

如果 imageCorners.size() 不为 0,我认为这个循环将永远运行。所以当这个

std::cout << imageCorners[i]<< std::endl;

被执行,在某些时候i 会越界,程序会崩溃。

【讨论】:

以上是关于为啥这个程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

这个程序崩溃了,为啥?

为啥这个应用程序在后台崩溃?

为啥这个 C 程序会崩溃?它编译得很好[重复]

为啥这个程序会崩溃:在 DLL 之间传递 std::string

为啥这个应用程序会因运行时错误而崩溃?

为啥这个 xamarin Binding Converter 会使应用程序崩溃?