我正在使用带有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?
}
我尝试调试和阅读各种问题/答案但我仍然无法调试此代码。任何帮助表示赞赏。
答案 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;
}