我的双向链表中的查找函数损坏
Broken Find Function in my Doubly Linked List
我不确定为什么我正在编写的DL列表中的这个查找函数不起作用。问题是tempNode->data和s之间的比较失败了。尽管数据相等,但比较评估为假。有人知道为什么吗?
bool DoublyLinkedList::find(string& s)
{
if(empty())
return false;
else
{
Node* tempNode = head;
do{
if(*(tempNode->data) == s)
{
return true;
}
tempNode = tempNode->next;
} while(tempNode != NULL);
return false;
}
}
class Node
{
public:
Node* next;
Node* prev;
string* data;
Node(){next = NULL; prev = NULL; data = NULL;};
~Node(){delete prev; delete next; delete data; next = NULL; prev = NULL; data = NULL;};
};
除了您有内存泄漏的事实之外,您似乎在这里比较指针:
if(tempNode->data == theSong) { .... }
你可能需要类似的东西
if(*(tempNode->data) == s) { .... }
您确实不需要绑定到theSong
的动态分配指针。此外,要find
的参数应该是const
引用:
bool DoublyLinkedList::find(const string& s)
// ^^^^^
通常,您应该将遍历链表与在其中查找元素分离。否则,您会发现自己在许多地方复制遍历代码错误。
您正在比较两个不同字符串对象的地址。请改用string::compare
或比较值。
另外,为什么要从现有字符串创建新字符串?
if (s.compare(tempNode->data) == 0)
或s == *(tempNode->data)
可能是您想要做的。
我想
把它写成评论,但我没有足够的声誉来这样做。
您绝对不应该比较字符串的地址,而应该比较字符串本身(至少在您的情况下)。还要注意字符串大小写比较,并确保指定是要进行区分大小写还是不区分大小写的比较。
除此之外,您不需要创建临时字符串对象,您可以使用传递给函数的形式参数本身。即使您曾经想创建临时变量,也应考虑使用 shared_ptr 或 unique_ptr 来避免内存泄漏。
Stephan T Lavavej最近在Go Native上有一个很好的演讲,我建议你观看它。现在网站已关闭,当网站再次返回时,我可以添加指向它的链接。
我还会将形式参数设为 const 以确保您不会意外修改输入参数。
相关文章:
- 动态构造函数中的新字符 [] 抛出"损坏的顶部大小";
- 调用std::函数成员时内存损坏
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 构造函数初始化和对象损坏
- 动态分配时类构造函数中的堆损坏
- 从第三方库导出 cpp 损坏的函数
- 在使用新操作员和C 中的结构的调用构造函数时,获得内存损坏(Malloc)
- Win32 C API:替代损坏的execl*()系列函数?
- 对于我的类函数,我得到双重释放或损坏错误
- 堆损坏 c++ 返回表指针的函数
- 析构函数会导致堆损坏
- 为什么链表中的数据在嵌套函数中会更改/损坏?
- 有没有一种方法可以使用RTTI获得基于签名的typeinfo损坏的函数名
- 在向量中使用不带复制且没有 noexcept 移动构造函数的对象.实际损坏的内容以及我如何确认它
- 函数的返回类型是损坏名称的一部分吗?
- 当使用实例会员方法作为函数指针时,堆积损坏
- 从 dll 中的函数返回时堆损坏
- 在递归函数中释放内存时堆损坏
- 网关函数损坏了从matlab到c++mex程序的输入
- 我的双向链表中的查找函数损坏