为什么此代码在此 Trie 实现中使用映射 c++ 中的指针崩溃?
Why does this code crash using pointers in map c++ in this implementation of Trie?
#include <iostream>
#include <vector>
#include <map>
#include <utility>
#include <iterator>
using namespace std;
class Node
{
public:
map<char,Node*> characters;
bool endOfWord = false;
Node()
{
}
Node(bool endOfWordBool)
{
this->endOfWord = endOfWordBool;
}
};
class Trie
{
public:
Node* root = nullptr;
Trie()
{
this->root = new Node();
}
这个函数是这里的问题。 使用我在每次迭代中设置的下一个节点崩溃,映射 stl 是否不支持具有指向内部对象的指针?
void insertWord(string word)
{
Node* currentNode = this->root;
for(unsigned int i = 0; i < word.length(); i++)
{
/// character is not in the map
if(currentNode->characters.find(word[i]) !=
currentNode->characters.end())
{
cout << "before create" << endl;
Node* nextNode = new Node();
currentNode->characters.insert(pair<char,Node*>(word[i],
nextNode));
currentNode = currentNode->characters.find(word[i])->second;
}
/// character is in the map
else
{
currentNode = currentNode->characters.find(word[i])->second;
}
}
currentNode->endOfWord = true;
}
};
int main()
{
Trie* t = new Trie();
string s = "ahmed";
t->insertWord(s);
return 0;
}
它使用设置的下一个节点在插入中崩溃。 有什么帮助吗?在这种情况下使用指针或将对象放在地图中是否更好?
问题是您的代码进行了错误的比较以查看映射中的元素是否存在。
这:
if (currentNode->characters.find(word[i]) != currentNode->characters.end())
应该是:
if (currentNode->characters.find(word[i]) == currentNode->characters.end())
通过使用错误的比较,您最终会使用未初始化的指针。
这也表明注释可以掩盖代码的作用 - 唯一真实的是代码。 我指的是不正确代码之前的这条评论:
/// character is not in the map
当然,代码并不能确定该字符是否不在地图中。 它实际上测试角色是否在地图中。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 将方法转换为调用该方法的成员函子对象会导致崩溃