C++中的浮点异常
以下Trie实现的代码在调用函数insert时引发浮点异常。for循环中检查现有节点的行就是问题所在C++中的浮点异常,c++,C++,以下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 (in
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");
}
<是否有帮助?< P>不要在C++代码中使用MALLC,除非你真正知道你在做什么
root = new Node;
及
问题是,由于使用malloc,因此没有调用Node::map的构造函数。使用new将确保调用所有必需的构造函数。当您使用malloc时,您不是在调用节点类构造函数,而是在分配内存
改用new,它将分配内存并调用构造函数。因此:
struct Node* tmp = (struct Node*) malloc(sizeof(struct Node));
应该是:
Node* tmp = new Node();
Node* root = new Node();
以及:
应该是:
Node* tmp = new Node();
Node* root = new Node();
记住在适当的地方删除。或者更好,使用。
最重要的是避免在类中使用C。使用适当的标准C++。是否尝试使用调试器来捕捉崩溃,然后在代码中找到精确的行?请先这样做。你确定这段代码有浮点异常吗?在它的任何地方都没有浮点。哦,停止使用C++的代码,像C++一样的Maloc。C++不是类的C。请正确学习C++,在标准C++中使用MALOC是不寻常的。除非你是一个库实现者。不管弹出的错误怎么说,这段代码并没有抛出浮点异常。出了点问题,操作系统正在猜测这个问题。内存损坏通常以浮点异常的形式报告,即使它与浮点无关,也没有抛出任何内容。因此,将该错误消息视为某些内容已损坏;没什么了。Node的隐式构造函数调用Node::map构造函数。谢谢你的帮助。它解决了这个问题。