[英]Floating point exception in C++ Trie
以下用於Trie實現的代碼在調用函數insert時引發了浮點異常。 問題所在是for循環內用於檢查現有節點的行。
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 ++。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.