gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:24:42 24 4
gpt4 key购买 nike

我正在尝试制作一个指针 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 的全部目的,您不妨改用数组。

关于c++ - 指针 vector 未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74312180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com