c++ - 指针 vector 未定义行为

我正在尝试制作一个指针 vector ,其元素指向 int 元素 vector 。 (我正在解决一个类似编程的竞争性问题,这就是为什么它听起来有点胡说八道)。

但这是代码:

#include <bits/stdc++.h>

using namespace std;

int ct = 0;

vector<int> vec;

vector<int*> rf;

void addRef(int n){
    vec.push_back(n);
    rf.push_back(&vec[ct]);
    ct++;
}


int main(){
    addRef(1);
    addRef(2);
    addRef(5);
    for(int i = 0; i < ct; i++){
        cout << *rf[i] << ' ';
    }
    cout << endl;
    for(int i = 0; i < ct; i++){
        cout << vec[i] << ' ';  
    }
}

当我执行代码时,它显示出我无法理解的奇怪行为。 rf ( vector<int*> ) 的第一个元素似乎没有指向 vec 的 ( vector<int> ) 元素,其余元素都指向它。

这是我在 Dev-C++ 上运行它时的输出:

1579600 2 5
1 2 5

当我尝试运行代码时 here ,输出甚至更奇怪:

1197743856 0 5 
1 2 5 

代码旨在第一行和第二行之间具有相同的输出。

你们能解释一下为什么会这样吗?我的实现有没有错误?

谢谢

最佳答案

使用 push_back 或类似方法将元素添加到 std::vector 可能会使所有迭代器和对其元素的引用无效。参见 https://en.cppreference.com/w/cpp/container/vector/push_back .

想法是为了增长 vector ,它可能没有足够的可用内存来扩展,因此可能必须将整个数组移动到内存中的其他位置,释放旧 block 。这尤其意味着您的指针现在指向已被释放或重新用于其他用途的内存。

如果你想保留这种方法,你将需要 resize()reserve() vec 中足够数量的元素在开始之前。这当然违背了 std::vector 的全部目的,您不妨改用数组。

https://stackoverflow.com/questions/74312180/

相关文章:

r - 如何根据另一列的另一个值在一列中收集数据

haskell - 或采用两个值参数 haskell

haskell - 如何使用两个映射遍历 Haskell 中的二元组?

function - 了解 Common Lisp 中的泛型函数?

r - 如何查找包含特定字符串的列名中 `NA`值的个数,并分别显示每列 `NA`值的个数?

python - 删除文本文件中每一行的最后一个字符

c++ - 为什么可以从另一个 unique_ptr get() 创建 unique_ptr 而不会

flutter - 显示 Bottom Sheet 时,有没有办法在屏幕上保持事件的 Gesture

java - 是否可以确保 JVM 中不存在两个相同的对象?

macos - 如何在格式化的 JSON 文件中使用 sed(或 awk)在匹配后插入一行?