奇怪的浮点异常C ++(指针分配)

时间:2020-04-14 13:20:33

标签: c++ stl floating-point unordered-map

我想创建一个树状结构,但要基于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,我不知道为什么。

1 个答案:

答案 0 :(得分:2)

原因是因为在分配了topic_tree结构之后,您并没有对其进行初始化。
因此std::unordered_map正在未初始化的内存上工作。

使用new / delete的最佳解决方案

通常,在C ++应用程序中,应避免使用malloc / free。而是使用newdelete运算符,它们会在构造时自动调用对象构造函数,
以及析构的析构函数。
像这样new topic_tree{}分配节点时,应该没问题。

如果要求使用malloc / free

如果要坚持使用malloc,则必须显式调用构造函数。
可以这样完成:

new (root) topic_tree{};

但是请注意,为了free需要调用析构函数的对象!

root->~topic_tree();

注意:如果您在代码中看到此消息,通常是代码的味道!
仅有很少的应用程序!

现代解决方案(带有智能指针的内存管理)

在现代C ++项目中,您甚至几乎根本看不到任何newdelete语句。
对于对象分配,您使用诸如
的智能指针 std::unique_ptrstd::shared_ptr(也std::auto_ptr,但有所不同)。
这些容器将自动管理对象的生存期,因此您完全不必担心。