我想创建一个树状结构,但要基于unordered_map
个主题。简而言之,我想创建一个主题树,然后想到了这种方法:
typedef struct topic_tree {
int id;
unordered_map<string, struct topic_tree *> children;
} topic_tree;
这听起来像是一个不错的主意,因为对于每个“主题”,我都会有一个ID(或我需要的东西),并且从每个节点开始,都有一个从下一个字符串到下一个topic_tree的映射,并且等等。
我试图创建此树:first/second/third
。这意味着第一个是第二个的父级,第二个是第三个的父级。可能还有其他情况,例如first/forth/fifty
这意味着现在第一个有两个孩子,第二个和第四个。这就是解释。现在让我们解决问题:
例如,我要声明这一点:
topic_tree *root = (topic_tree *)malloc(sizeof(struct topic_tree));
root->id = -1;
topic_tree *x = (topic_tree *)malloc(sizeof(struct topic_tree));
x->id = 5;
root->children["first"]=x;
但这是:root->children["first"] = x;
给了我Floating point exception
,我不知道为什么。
答案 0 :(得分:2)
原因是因为在分配了topic_tree
结构之后,您并没有对其进行初始化。
因此std::unordered_map
正在未初始化的内存上工作。
new
/ delete
的最佳解决方案通常,在C ++应用程序中,应避免使用malloc
/ free
。而是使用new
和delete
运算符,它们会在构造时自动调用对象构造函数,
以及析构的析构函数。
像这样new topic_tree{}
分配节点时,应该没问题。
malloc
/ free
如果要坚持使用malloc,则必须显式调用构造函数。
可以这样完成:
new (root) topic_tree{};
但是请注意,为了free
需要调用析构函数的对象!
root->~topic_tree();
注意:如果您在代码中看到此消息,通常是代码的味道!
仅有很少的应用程序!
在现代C ++项目中,您甚至几乎根本看不到任何new
或delete
语句。
对于对象分配,您使用诸如
的智能指针
std::unique_ptr
或std::shared_ptr
(也std::auto_ptr
,但有所不同)。
这些容器将自动管理对象的生存期,因此您完全不必担心。