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);
将无法编译。很抱歉,这是我的错,在段之前应该是“&”