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

哈泽姆·阿巴扎

在 Class.h

Struct Node
{
   int ID;
   int position;

}

在 Class.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-object(而不仅仅是指向它的指针)。所以至少访问其成员是保存。

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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章