C++ 如果我将在堆栈上分配的元素的指针推入std::vector,它的成员';s值被改变

C++ 如果我将在堆栈上分配的元素的指针推入std::vector,它的成员';s值被改变,c++,visual-c++,vector,stack,C++,Visual C++,Vector,Stack,如果我以如下所示的方式向std::vector添加了两个以上的项,则添加项的成员值将发生更改 下面是一个最小、完整且可验证的示例: #include <iostream> #include <vector> struct B; struct C { float x; C(float x) { this->x = x; } }; struct A : public C { bool begin;

如果我以如下所示的方式向
std::vector
添加了两个以上的项,则添加项的成员值将发生更改
下面是一个
最小、完整且可验证的示例

#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;
}
#包括
#包括
结构B;
结构C
{
浮动x;
C(浮动x)
{
这个->x=x;
}
};
结构A:public
{
布尔开始;
布尔可见;
B*B;
A(浮动x,B*父级)
:C(x)
{
开始=错误;
可见=假;
b=父母;
}
};
结构B
{
A a1;
A a2;
B(浮动x1,浮动x2)
:a1(x1,这个),a2(x2,这个)
{
a1.可见=真实;
}
};
int main()
{
std::向量bs;
std::向量as;
B.推回(B(1,2));
as.向后推(&bs.向后推().a1);
as.向后推(&bs.向后推().a2);
B.推回(B(2,3));
as.向后推(&bs.向后推().a1);
as.向后推(&bs.向后推().a2);
用于(自动和it:as)
{

std::cout begin问题在于,当向向量添加更多元素时,它可能会调整自身大小。当这种情况发生时,所有元素都会移动到新位置,所有现有的指针和元素引用都会失效

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


例如,
boost::stable_vector
std::list
代替
std::stable
可以解决问题,前提是您不需要连续存储
元素。

问题是,当向向量添加更多元素时,它可能会调整自身大小。发生这种情况时,所有元素都会移动到新的loca并且所有现有的指向元素的指针和引用都将失效

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


例如,
boost::stable_vector
std::list
代替
std::stable
可以解决问题,前提是您不需要连续存储
Segment
元素。

您能提供精确的代码片段和带有神秘两段的示例输出吗?作为补充说明,您的CTOR有一些字段在init列表中初始化,而在主体中分配其他对象。不确定这是否与问题有关,但我注意到您的
端点
持有指向
段的指针
,但是,当您将该段放入
向量
时,会生成一个副本,使这些指针无效(他们仍然指向您推送的临时文件)。
emplace\u back
可能会解决这个问题。其他问题不多,我只是四处测试,但我确信我可以添加所有代码(我认为最好缩短它)。是否要告诉我,如果我在主体中混合使用了初始化器列表和初始化,这是一个问题?
端点。向后推(segments.back().p2)
将无法编译。很抱歉,在分段扫描之前,我的错误应该是“&”。请提供精确的代码片段和带有神秘两段的示例输出?作为补充说明,您的CTOR在init列表中初始化了一些字段,而其他字段在正文中分配。不确定这是否与问题有关,但我注意到您r
端点
持有指向
段的指针
,但是,当您将该段放入
向量
时,会生成一个副本,使这些指针无效(它们仍然指向您推送的临时指针).
emplace\u back
可能会解决这个问题。我只是四处测试,但我确信我可以添加所有代码(我认为最好缩短它)。你想告诉我,如果我在主体中混合使用Iniatizer列表和初始化,这是个问题吗?
端点。推回(segments.back().p2);
将无法编译。很抱歉,这是我的错,在段之前应该是“&”