我的对象在矢量中的地址发生了变化

这个问题在这里已经有了答案:

  • 迭代器失效规则4个答案

  • 您正在for循环中调用vec.push_back(a) 。 因此,如果空间不足,向量可能会重新分配基础数组。 因此,如果先前元素的地址被复制到新的内存位置,则其地址不再有效。

    比如说你分配了3个元素并存储了他们的地址。 在推回第四个元素之后,矢量必须重新分配。 这意味着前3个元素将被复制到一个新的位置,然后第4个将被添加。 因此,您为前3个地址存储的地址现在无效。


    在调用vector<T>::push_back()时,不保证迭代器(以及引用和对象地址)保留。 如果新size()大于当前capacity() ,则会发生重新分配,并且将所有元素移动或复制到新位置。

    为了避免这种情况,您可以在开始插入之前调用reserve()


    std::vector一个主要特性是它将其元素存储在连续的内存中 (当访问现代CPU上的矢量项时,这对性能很好)。

    不利的一面是当矢量的预分配内存已满并且您想要添加新项目(例如调用vector::push_back() )时,矢量必须分配另一块连续内存,并且复制/移动从以前的位置到新的位置的数据。 作为重新分配和复制/移动的结果,旧项目的地址可能会改变。

    如果由于某种原因,你想保留对象的地址,而不是将这些对象的实例存储在std::vector ,你可以考虑有一个指向对象的向量的向量。 在这种情况下,即使在重新分配之后,对象指针也不会改变。

    例如,您可以将shared_ptr用于vector的项目和multimap的项目:

    vector<shared_ptr<const A>> vec;
    
    multimap<shared_ptr<const A>, const double> mymultimap;
    
    链接地址: http://www.djcxy.com/p/73333.html

    上一篇: The address of my object in a vector changes

    下一篇: Rules for Iterator Invalidation