在std::vector中压入std::pair时出错

Error while pushing a std::pair in std::vector

本文关键字:std pair 出错 vector      更新时间:2023-10-16

我发现在

Template < class a, class b > 
std::vector < std::pair < a, b > >::push_back(...)

几乎总是产生分段错误。

我看了一下,发现stl_uninitialized.h(第269行)出现了一个错误。

我发现最简单的工作是为矢量保留所需的/一些大空间,然后进行推回。它起作用了,但我不相信。为什么会出现错误

(我的初始代码甚至没有模板化。它的字段是

std::pair < float, cv::RotatedRect > 

我在这里模板,让人们能够给出通用的答案)。

localDetections声明:

std::向量& lt;std::向量& lt;std::一对& lt;float, cv::RotatedRect>>>localDetections;localDetections.resize (m_allSizes.size ());

其中m_allSizes是一个no的向量。将用于搜索和填充的大小。for条件也是:

for (int = 0;坐& lt;m_allSizes.size ();坐+ +){

使用位置:

              cv::RotatedRect oupRect;                                                                                          
              cv::Point2d src_center(img.cols/2., img.rows/2.);                                                                 
              rotateRectInSpace(newRect, oupRect, src_center, -(rotatedAngle));                                                 
              std::pair<float, cv::RotatedRect> newPair((float)finval, oupRect);                                      
              localDetections[sit].push_back(newPair);

sit是for循环中的一个变量,从0到localdetections的大小。

您的代码中有一个潜在的错误,sit可能溢出为负数。你可能想要将sit转换为vector::size_type,或者只是使用迭代器,或者push_back向量到localDetections上作为循环的一部分,而不是事先调整大小。

或者,当您试图复制或分配cv::RotatedRect oupRect时,可能会发生一些不好的事情。

这件事有很多未知之处。张贴的代码没有明显的错误。调试器比StackOverflow更有帮助。

您需要首先为locaDetections分配内存,使用localDetections。调整大小之类的

localDetections需要至少包含sit在调用之前分配的位置:

localDetections[sit].push_back(newPair);