C++Trie中的浮点异常

Floating point exception in C++ Trie

本文关键字:异常 C++Trie      更新时间:2023-10-16

Trie实现的以下代码在调用函数insert时抛出浮点异常。环路内部用于检查现有节点的线路是问题所在的地方。

struct Node {
char c;
bool isend;
unordered_map<int, struct Node*> map;
};
void insert(struct Node* root, string contact) {
int size = contact.size();
char ch;
for (int i = 0; i < size; i++) {
ch = contact[i];
// this check is creating problem
if (root->map.find(ch) == root->map.end()) {
struct Node* tmp = (struct Node*) malloc(sizeof(struct Node));
tmp->c = ch;
if (i == (size - 1)) {
tmp->isend = true;
} else {
tmp->isend = false;
}
root->map.insert(make_pair(ch, tmp));
root = tmp;            
} else {
root = root->map[ch];   
}         
}
}
int main()
{
struct Node* root = NULL;
root = (struct Node*) malloc(sizeof(struct Node));
insert(root, "text");
}

有什么帮助吗?

不要在C++代码中使用malloc(除非你真的知道自己在做什么(

root = new Node;

tmp = new Node;

问题是,因为您使用malloc,所以Node::map的构造函数不会被调用。使用new将确保调用所有必要的构造函数。

当您使用malloc时,您不是在调用Node类构造函数,而是在分配内存。

请改用new,它将分配内存调用构造函数。因此:

struct Node* tmp = (struct Node*) malloc(sizeof(struct Node));

应该是:

Node* tmp = new Node();

和:

struct Node* root = NULL;
root = (struct Node*) malloc(sizeof(struct Node));

应该是:

Node* root = new Node();

请记住在适当的情况下使用delete。或者更好的是,使用智能指针。最重要的是,避免在类中使用C。使用适当的标准C++。