c++ - vector.back() 的意外值

标签 c++ pointers vector

我一直在想这个。

#include <iostream>
#include <vector>

int main() {

    std::vector<int> a;
    std::vector<int *> b;

    a.push_back(13);
    b.push_back(&a.back());

    a.push_back(24);
    b.push_back(&a.back());

    for (std::vector<int>::iterator it = a.begin(); it != a.end(); ++it)
        std::cout << *it << " ";
    std::cout << "\n";

    for (std::vector<int *>::iterator it = b.begin(); it != b.end(); ++it)
        std::cout << *(*it) << " ";
    std::cout << "\n";

    return 0;
}

输出:

13 24
16712910 24

我真的很想知道,为什么两条输出线不匹配。我在这里错过了什么?我用 gcc 4.6.3 编译了这个

最佳答案

发生这种情况是因为 vector 在第二次 push_back 期间增长并重新分配了元素。当您执行第二个 push_back 时, vector 可能会发现其容量已满并分配新空间并将元素移动到新内存。它还释放先前分配的内存。由于您正在存储此已释放内存位置的地址,因此您会看到垃圾值。要解决此问题,您需要执行 a.reserve(2) 以便在 push_back 的 2 个整数期间不会重新分配 vector 。

关于c++ - vector.back() 的意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16712140/

相关文章:

c++ - 通过显式调用类构造函数来使用对象与默认初始化+赋值运算符

C++:如何正确地遍历指向的 vector

c++ - "CL.exe"未在独立项目中编译 C++

c++ - 关于迭代器性能的重点应该放在进步还是元素访问上?

c++ - 将右值引用分配给成员变量

c++ - 使用指针作为函数参数

c++ - 您如何获得程序使用了多少内存?

c - 错误: incompatible types when initializing type

c++ - vector 的 std::remove 和删除之间的区别?

c++ - 如何在 header 中声明一个 vector 然后分配它