如果我不使用 vector.reserve(),为什么我的指针会失效?



我的代码很小,它会引起二维顶点的类(vector2)的向量(vector2)和模板类Dynamicline的向量,该class dynamicline将vector2 type type type toge for参数。

std::vector<Vector2> m_coords;
std::vector<DynamicLine<Vector2>> m_lines;
Vector2 *lineVec = NULL;


 bool draw = true;
 case DrawingWidgetState::ADD_VERTEX_SELECTED:{
                for(auto it = m_coords.begin(); it != m_coords.end(); it++)
                     if(it->distanceFrom(Vector2(event->x(), event->y())) < 20 && !m_coords.empty()){
                        draw = false;
                        break;
                     }
                if(draw){
                    if(event->x() < m_mainWindow->width() - 10 && event->x() >= 10
                            && event->y() < m_mainWindow->height() && event->y() >= 10) {

                        m_coords.push_back(Vector2(event->x(), event->y()));
                        update();
                    }
                }
                break;
            }

case DrawingWidgetState::ADD_LINE_SELECTED:{
                for(auto it = m_coords.begin(); it != m_coords.end(); it++)
                    if(it->distanceFrom(Vector2(event->x(), event->y())) < 10){
                        if(!i){
                            lineVec = &(*it);
                            i++;
                        }
                        else{
                            m_lines.push_back(DynamicLine<Vector2>(lineVec, &(*it)));
                            i = 0;
                        }
                        update();
                        break;
                    }
                break;
            }

问题是下一个。例如,如果我添加两个顶点和它们之间的一条线,那么一切都很好。但是,如果我现在添加另一个顶点(m_coords.push_back(vector2(event-> x(),event-> y()));),则将dissaperas和m_lines vector中的dissaperas和值更改为非常随机的大数字。我读了一些有关指针无效的东西。如果您将新值推向向量,那么有些值最终将被扩展。我还使用vector ::储备解决了我的问题,但是由于我确定我没有做正确的事/div>

我没有密切查看您的代码,但是似乎是向量导致您麻烦的矢量的重新分配。

矢量始终跟踪两个尺寸:其容量及其包含的对象数量。如果您进行push_back,并且其容量已经达到最大,则它将自身复制到具有更多空间和更大容量的内存中的另一个位置。您的指针可能仍指向原始位置。

使用向量时,最好保留索引而不是指针。

编辑:您可以通过一个可能执行插入操作的数组进行迭代。那不应该。

它很简单。当您push_backvector没有足够的capacity时,需要分配更多内存并复制(或移动)您的元素到新位置。这使指向旧元素的任何迭代器/指针无效(它们现在只是指向旧的释放内存块),这意味着它们基本上指向垃圾 - 因此,您必须在push_back之后获得新的迭代器。

调用 reserve告诉向量,请预先分配一个内存块,以便可以保证任何后续 push_back不需要重新分配(如果您留在预订中(实际上是capacity))和因此,不会使迭代器/指针无效。

最新更新