奇怪的浮点异常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
。而是使用 new
和 delete
运算符,它们会在构造时自动调用对象构造函数,
和 desctruction 上的析构函数。
像这样分配节点时: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
也一样,但有点不同)。
这些容器将自动管理对象的生命周期,因此您完全不必担心。
我想创建一个 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
。而是使用 new
和 delete
运算符,它们会在构造时自动调用对象构造函数,
和 desctruction 上的析构函数。
像这样分配节点时: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
也一样,但有点不同)。
这些容器将自动管理对象的生命周期,因此您完全不必担心。