在std :: map中使用struct作为值时的运行时错误?

时间:2017-05-14 09:35:11

标签: c++ struct runtime-error stdmap

我正在使用带有int值的地图 - > trie,trie是结构。那么为什么我在地图中打印所有键值时会出现运行时错误?但如果我不打印任何内容,则没有错误(插入()部分不会导致任何错误。)

struct trie{
    node *root;
    trie(){
        root = new node();
    }
    void insert(int x){
        node *cur = root;
        for(int i = 31; i >= 0; i--){
            int b = (x >> i) & 1;
            if (cur->child[b] == NULL) cur->child[b] = new node();
            cur = cur->child[b];
        }
        cur->isleaf = true;
    }
    int maxxor(int x){
        node *cur = root;
        int res = 0;
        for(int i = 31; i >= 0; i--){
            int b = (x >> i) & 1;
            if (cur->child[b ^ 1] != NULL){
                res |= (1ll << i);
                cur = cur->child[b ^ 1];
            } 
            else cur = cur->child[b];
        }
        return res;
    }
    int minxor(int x){
        node *cur = root;
        int res = 0;
        for(int i = 31; i >= 0; i--){
            int b = (x >> i) & 1;
            if (cur->child[b] != NULL) cur = cur->child[b];
            else{
                res |= (1ll << i);
                cur = cur->child[b ^ 1];
            }
        }
        return res;
    }
    ~trie(){
        delete root;
    }
};
map<int, trie> tr;
int32_t main(){
    ios::sync_with_stdio(false);
    tr[3].insert(1);// no error
    for(auto x: tr) cout << x.first << ' '; //RUNTIME ERROR?
}

我尝试调试和阅读各种问题/答案但我仍然无法调试此代码。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

如果我可以说,您已经使用链接列表实现了“复杂”树。并且为了避免麻烦,你需要确保你的析构函数按比例执行其工作并且是连贯的,即销毁所有已分配的内存,并且不“试图”“破坏”未分配的空间或已经破坏的空间。

那就是说,你的trie析构函数会破坏调用node析构函数的根数据成员。节点析构函数会破坏两个未必分配的子节点。这是您的分段错误的起源。

要纠正这个问题,你应该只销毁分配的孩子。 这是代码的简化版本

#include <bits/stdc++.h>
#define int int64_t
using namespace std;
struct node{
    node* child[2];
    bool isleaf;

    node(){
        child[0] = child[1] = NULL;
        isleaf = false;
    }

    ~node(){            
    }
};
struct trie{
    node *root;
    trie(){
        cout << " in trie ctor" << endl;
        root = new node();
    }

    void insert(int x){
        cout << "in insert trie methode " << endl;

        node *cur = root;

        cur->child[0] = new node();
        cur->child[1] = new node();

    }

    ~trie(){
        delete root->child[0]; // i'm sure it has been allocated
        delete root->child[1]; // i'm sure it has been allocated
        // delete root, would be like doing int *p; delete p;
    }
};

map<int, trie> tr;
int32_t main(){

    ios::sync_with_stdio(false);
    tr[3].insert(1);
    for(auto x: tr) 
        cout << x.first << endl << endl;    
}