簡體   English   中英

C ++ Trie中的浮點異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM