初始化构造函数C++中结构的向量

Initializing Vector of Structs in Constructor C++

本文关键字:向量 结构 构造函数 C++ 初始化      更新时间:2023-10-16

in Class.h

Struct Node
{
int ID;
int position;
}

在类中.cpp我正在初始化导致核心转储错误的结构向量

Class::Class(const branch& branches):mybranches(branches)
{
for (const auto & branch:mybranches)
{
Node* node
node->ID= branch->ID
node->position= branch->position
mynodesvector.push_back(std::move(node));
}
}

但是像这样初始化它不会出错

Class::Class(const branch& branches):mybranches(branches)
{
for (const auto & branch:mybranches)
{
Node node
node.ID= branch->ID
node.position= branch->position
mynodesvector.push_back(&node);
}
}

我想知道将其初始化为指向结构的指针时出现核心转储错误的原因是什么。

您不会创建/分配node*指向的对象; 因此取消引用node会导致未定义的行为;

Node* node;
node->ID= branch->ID;  // UB here...

但是,分配一个对象,例如

Node* node = new Node();
node->ID= branch->ID; 
...

应该工作。

在第二个示例中,定义了一个Node-对象(而不仅仅是指向它的指针(。因此,至少访问其成员是保存的。

Node node;  // defines a Node-object.
node.ID= branch->ID; //save
node.position= branch->position; // save

但是,请注意,您push_back指向具有块作用域的对象的指针;稍后取消引用此指针时,实际对象将超出范围,然后您将获得未定义的行为。

mynodesvector.push_back(&node);

我建议看看std::shared_ptr<Node>.

除了@Stefan Lechner的回答:

没有抛出直接错误的版本有一个错误,每当您尝试修改 mynodesvector 中的值时,该错误都可能会爆炸: 在堆栈上初始化结构,然后将其地址推送到向量中。一旦 for 循环的迭代终止,Node 实例就会被销毁,但向量中仍有指向它的指针。

for (const auto & branch:mybranches)
{
{
Node node
node.ID= branch->ID
node.position= branch->position
mynodesvector.push_back(&node);
}
// here, Node is dead, but the pointer to it lives on.
}

为了找到逃脱代码控制的错误,我建议启用编译器警告并使用适当的清理器。