初始化构造函数C++中结构的向量
Initializing Vector of Structs in Constructor C++
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.
}
为了找到逃脱代码控制的错误,我建议启用编译器警告并使用适当的清理器。
相关文章:
- 将结构向量排序为子组
- 访问存储在向量C++中的结构的多态成员
- NLOHMANN 的 JSON 库将数组转换为结构向量
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 如何在 c++ 中创建结构向量的映射
- 带unique_ptr的结构向量
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 将 int 映射到 C++ 中的向量结构
- 如何在 c++ 中的向量结构中使用结构向量
- 无法将值存储到向量结构中
- 无法将.CSV文件读取为代表向量结构的类
- MPI,C,派生类型,向量结构
- 向量结构的打印成员
- 在 c++ 中对向量<结构 S> 进行二分搜索?
- 不需要删除向量<结构A*>
- 在C++中循环向量结构<string>
- 将字符串放入字符串的向量结构中
- 共享内存中的向量结构
- 我的向量结构没有像预期的那样迭代