奇怪的浮点异常c++(指针赋值)

Weird floating point exception c++ (pointer assignment)

我想创建一个 tree-like 结构,但基于 unordered_map 个主题。总之,我想创建一个主题树,我想到了这个方法:

typedef struct topic_tree {
    int id;
    unordered_map<string, struct topic_tree *> children;
} topic_tree;

这听起来是个不错的主意,因为对于每个 "topic" 我都会有一个 ID(或任何我需要的),然后从每个节点都有一个从下一个字符串到下一个 topic_tree 等等。

我试图创建这棵树:first/second/third。这意味着首先是第二个的parent,第二个是第三个的parent。可能还有其他的东西,比如first/forth/fifty 这意味着现在第一个有 2 children,第二个和第四个……这就是解释。现在让我们开始解决问题:

例如我声明:

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 我不知道为什么..

原因是因为在您分配 topic_tree 结构之后您没有初始化它。
所以 std::unordered_map 正在处理不起作用的未初始化内存。

使用 new/delete

的最佳解决方案

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

如果您需要使用malloc/free

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

new (root) topic_tree{};

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

root->~topic_tree();

注意:如果您在代码中看到这个,通常是代码味道!
它的应用程序很少!

现代解决方案(使用智能指针进行内存管理)

在现代 C++ 项目中,您几乎看不到任何 newdelete 语句。
而不是对象分配你使用智能指针,如
std::unique_ptrstd::shared_ptrstd::auto_ptr 也一样,但有点不同)。
这些容器将自动管理对象的生命周期,因此您完全不必担心。