我正在尝试为每个节点构建一个具有未知数目的子代的树。为此,我构造了一个带有子节点向量的结构,以便可以根据需要增大其大小。 以下代码是我定义结构的方式:
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
代码已编译,没有任何错误。 我怀疑随着树向量的增长,它超过了最初分配给它的内存大小,从而导致了一些潜在的问题。 我是否缺少某些东西,或者是否有更好的方法来构造这种树? 非常感谢您提供任何建议。
答案 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