gpt4 book ai didi

c++ - 如果我将分配在堆栈上的元素的指针插入 std::vector ,则其成员的值将被更改

转载 作者:行者123 更新时间:2023-11-30 01:44:11 25 4
gpt4 key购买 nike

如果我向 std::vector<A*> 添加超过 2 个项目如下图所示,添加项的成员值发生变化
这是一个 Minimal, Complete and Verifiable Example :

#include <iostream>
#include <vector>

struct B;

struct C
{
float x;

C(float x)
{
this->x = x;
}
};

struct A : public C
{
bool begin;
bool visible;
B* b;

A(float x, B* parent)
: C(x)
{
begin = false;
visible = false;
b = parent;
}
};

struct B
{
A a1;
A a2;

B(float x1, float x2)
: a1(x1, this), a2(x2, this)
{
a1.visible = true;
}
};

int main()
{
std::vector<B> bs;
std::vector<A*> as;
bs.push_back(B(1, 2));
as.push_back(&bs.back().a1);
as.push_back(&bs.back().a2);
bs.push_back(B(2, 3));
as.push_back(&bs.back().a1);
as.push_back(&bs.back().a2);

for(auto& it : as)
{
std::cout << it->begin << std::endl;
}

std::cin.get();

return EXIT_SUCCESS;
}

上面的代码还有一个问题(tobi303 的评论中已经提到了):指针B* b来自结构 A由于 push_back(B(...)) 变得无效复制 B 的实例,解决方案是使用 emplace_back相反

最佳答案

问题是当更多的元素被添加到一个 vector 时,它可能会调整自己的大小。发生这种情况时,所有元素都将移动到新位置,并且所有现有的指针和对元素的引用都会失效。

有些容器在添加新元素时不会使迭代器失效,例如std::list boost::stable_vector .

boost::stable_vector<Segment>std::list<Segment>而不是 std::stable<Segment>如果您不需要 Segment 的连续存储,将解决此问题元素。

关于c++ - 如果我将分配在堆栈上的元素的指针插入 std::vector ,则其成员的值将被更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36548983/

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