gpt4 book ai didi

c++ - 带有 push_back 的 libstdc++ 错误可复制 vecor 元素

转载 作者:行者123 更新时间:2023-12-04 02:25:27 24 4
gpt4 key购买 nike

我在下面的小程序中遇到了以下错误:

#include <vector>
#include <iostream>

using namespace std;

int main() {
vector<int> t;
t.push_back(0);
for(int i = 1; i < 1024; i++) {
auto& x = t[i-1];
t.push_back(x);
t.push_back(x);
t.push_back(x);
}
return 0;
}

它编译良好并且执行没有任何错误。但是如果你用 valgrind 运行它(Linux 机器),你会得到一个内存错误:

==122572== Invalid read of size 4
==122572== at 0x10A051: void __gnu_cxx::new_allocator<int>::construct<int, int const&>(int*, int const&) (in /home/casse/tmp/bug)
...

现在,如果您稍微更改上面的代码:

auto x = t[i-1];

(不是获取引用,而是从 vector 中复制元素),valgrind 不再提示。

有什么想法吗?

最佳答案

push_back可能会导致重新分配,然后所有引用都无效,并且对无效引用的取消引用会导致 UB。

If the new size() is greater than capacity() then all iterators and references (including the past-the-end iterator) are invalidated.

您可以使用 reserve提前避免重新分配。

vector<int> t;
t.reserve(1 + 1023 * 3);
t.push_back(0);
for(int i = 1; i < 1024; i++) {
auto& x = t[i-1];
t.push_back(x);
t.push_back(x);
t.push_back(x);
}

另一方面,对于 auto x = t[i-1];x 是从 t[i-1] 并且独立于 t[i-1],不再有无效引用问题。

关于c++ - 带有 push_back 的 libstdc++ 错误可复制 vecor 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68032486/

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