EXC_BAD_ACCESS 在 unordered_map
EXC_BAD_ACCESS in unordered_map
代码是c++14中的简单Trie实现。执行add("name")
函数时弹出如下错误:EXC_BAD_ACCESS (code=1, address=0x20))
下面是一些调试图片:
遵循以下代码:
struct TrieNode {
string value;
unordered_map<char, TrieNode *> children = {};
};
class Trie {
public:
TrieNode *root = new TrieNode;
TrieNode *find(string query);
int countPartialFind(string query);
void add(string value);
private:
void add(string value, TrieNode *node);
TrieNode *createNewNode(string &value, int counter, unordered_map<char, TrieNode *> &children);
void add(string value, int counter, TrieNode *node);
TrieNode *findNode(char query, unordered_map<char, TrieNode *> &children);
};
TrieNode *Trie::find(string value) {
TrieNode *tmpNode = root;
for (int counter = 0; counter < value.length(); counter++) {
tmpNode = findNode(value[counter], tmpNode->children);
if (tmpNode == NULL) {
return NULL;
}
}
return tmpNode;
}
int Trie::countPartialFind(string query) {
TrieNode *matchNode = find(query);
if (matchNode == NULL) {
return 0;
}
return matchNode->children.size();
}
void Trie::add(string value, int counter, TrieNode *node) {
for (; counter < value.length(); counter++) {
node = findNode(value[counter], node->children);
if (node == NULL) {
node = createNewNode(value, counter, node->children);;
}
}
}
TrieNode *Trie::findNode(char query, unordered_map<char, TrieNode *> &children) {
unordered_map<char, TrieNode *>::const_iterator search = children.find(query);
if (search == children.end()) {
return NULL;
}
return search->second;
}
TrieNode *Trie::createNewNode(string &value, int counter, unordered_map<char, TrieNode *> &children) {
TrieNode *newNode = new TrieNode;
newNode->value = value.substr(0, counter + 1);
char tmp = value[counter];
children[tmp] = newNode;
return newNode;
}
void Trie::add(string value) {
if (value.length() == 0) { return; }
int counter = 0;
TrieNode *tmpNode = findNode(value[counter], root->children);
if (tmpNode == NULL) {
tmpNode = createNewNode(value, counter, root->children);
}
add(value, ++counter, tmpNode);
}
这个问题应该是微不足道的,但我听不懂。感谢您的帮助,如果还有任何其他优化或代码设计可以完成,请告诉我。
在3参数Trie::add
函数中,调用createNewNode
时,node
已知为NULL
。第三个参数 node->children
取消引用 NULL 指针,导致未定义的行为,在这种情况下会导致崩溃。
如果您在局部变量的值处查找调用堆栈,您会看到这一点。
代码是c++14中的简单Trie实现。执行add("name")
函数时弹出如下错误:EXC_BAD_ACCESS (code=1, address=0x20))
下面是一些调试图片:
遵循以下代码:
struct TrieNode {
string value;
unordered_map<char, TrieNode *> children = {};
};
class Trie {
public:
TrieNode *root = new TrieNode;
TrieNode *find(string query);
int countPartialFind(string query);
void add(string value);
private:
void add(string value, TrieNode *node);
TrieNode *createNewNode(string &value, int counter, unordered_map<char, TrieNode *> &children);
void add(string value, int counter, TrieNode *node);
TrieNode *findNode(char query, unordered_map<char, TrieNode *> &children);
};
TrieNode *Trie::find(string value) {
TrieNode *tmpNode = root;
for (int counter = 0; counter < value.length(); counter++) {
tmpNode = findNode(value[counter], tmpNode->children);
if (tmpNode == NULL) {
return NULL;
}
}
return tmpNode;
}
int Trie::countPartialFind(string query) {
TrieNode *matchNode = find(query);
if (matchNode == NULL) {
return 0;
}
return matchNode->children.size();
}
void Trie::add(string value, int counter, TrieNode *node) {
for (; counter < value.length(); counter++) {
node = findNode(value[counter], node->children);
if (node == NULL) {
node = createNewNode(value, counter, node->children);;
}
}
}
TrieNode *Trie::findNode(char query, unordered_map<char, TrieNode *> &children) {
unordered_map<char, TrieNode *>::const_iterator search = children.find(query);
if (search == children.end()) {
return NULL;
}
return search->second;
}
TrieNode *Trie::createNewNode(string &value, int counter, unordered_map<char, TrieNode *> &children) {
TrieNode *newNode = new TrieNode;
newNode->value = value.substr(0, counter + 1);
char tmp = value[counter];
children[tmp] = newNode;
return newNode;
}
void Trie::add(string value) {
if (value.length() == 0) { return; }
int counter = 0;
TrieNode *tmpNode = findNode(value[counter], root->children);
if (tmpNode == NULL) {
tmpNode = createNewNode(value, counter, root->children);
}
add(value, ++counter, tmpNode);
}
这个问题应该是微不足道的,但我听不懂。感谢您的帮助,如果还有任何其他优化或代码设计可以完成,请告诉我。
在3参数Trie::add
函数中,调用createNewNode
时,node
已知为NULL
。第三个参数 node->children
取消引用 NULL 指针,导致未定义的行为,在这种情况下会导致崩溃。
如果您在局部变量的值处查找调用堆栈,您会看到这一点。