结构中的向量导致分段错误

时间:2018-10-13 18:02:44

标签: c++ vector struct tree segmentation-fault

我正在尝试为每个节点构建一个具有未知数目的子代的树。为此,我构造了一个带有子节点向量的结构,以便可以根据需要增大其大小。 以下代码是我定义结构的方式:

typedef struct Tree_node{
  int item;
  int count;
  struct Tree_node *parent;           //point to the parent node
  vector<struct Tree_node *> child;   //a vector of child node, can grow in size
}TREE_NODE;

typedef struct{
  vector<TREE_NODE *> root;
}FP_TREE;

我在网上找到文章说struct中的vector非常好。但是,当我尝试执行以下示例代码时,终端显示“分段错误”

FP_TREE *tree = (FP_TREE *)malloc(sizeof(FP_TREE));
TREE_NODE *test = (TREE_NODE *)malloc(sizeof(TREE_NODE));
tree->root.push_back(test);    //sth wrong here

代码已编译,没有任何错误。 我怀疑随着树向量的增长,它超过了最初分配给它的内存大小,从而导致了一些潜在的问题。 我是否缺少某些东西,或者是否有更好的方法来构造这种树? 非常感谢您提供任何建议。

1 个答案:

答案 0 :(得分:0)

在C ++中,使用malloc的方式是未定义的行为,因为它不执行对象初始化,这意味着它没有调用向量的构造函数(但是在初始化vtable时还有其他事情没有完成)例如,如果有一个。)

在您的示例中,您应该使用new:

FP_TREE *tree = new FP_TREE();
TREE_NODE *test = new TREE_NODE();
tree->root.push_back(test);
//This code will leak unless you call delete tree; delete test;

但是在C ++中,您真正应该做的就是依靠RAII并避免使用原始指针(如果需要使用指针,请使用智能指针,例如std :: unique_ptr)

FP_TREE tree{};
TREE_NODE test{};
tree.root.push_back(&test);
//Be careful, you can end up with a dangling pointer stored in 
//tree.root if test goes out of scope