将对象与应等于 NULL 的 NULL 进行比较时出现分段错误
Segmentation fault when comparing an object to NULL which should equal NULL?
我在程序中遇到一个关键功能时遇到了一点麻烦,我已经在任何地方放置了错误测试行,并将其单调到一个if
语句"
template <typename Item>
bool BTNode<Item>::isNull(string leftOrRight)
{
std::cout<<"Is NULL test outer."<<endl;
bool returnNullTest = true;
if (leftOrRight == "left")
{
std::cout<<"Is NULL test inner 1."<<endl;
if (left != NULL)
{
returnNullTest = false;
}
}
else if (leftOrRight == "right") //.c_str()
{
std::cout<<"Is NULL test inner 2."<<endl;
if (right != NULL)
{
returnNullTest = false;
}
}
std::cout<<"NULL TEST FINISHED."<<endl;
return returnNullTest;
}
这是输出:
Is NULL test outer.
Is NULL test inner 2.
Segmentation fault (core dumped)
这是"左"和"右"的定义:
BTNode<Item>* left;
BTNode<Item>* right;
在BTNode的构造函数中,"左"和"右"定义为:
left = NULL;
right = NULL;
有没有人知道我哪里出了问题,我已经尝试过这条线
if (left == NULL)
和
if (right == NULL)
布尔值切换,但我得到了同样的错误。
这是"BTNode.h"
#ifndef matt_BTNode
#define matt_BTNode
#include <cstdlib>
namespace mattassign3{
template <typename Item>
class BTNode
{
private:
Item* data;
BTNode<Item>* left;
BTNode<Item>* right;
public:
BTNode();
BTNode(Item* startingData);
~BTNode();
BTNode<Item>* getLeft();
BTNode<Item>* getRight();
Item* getData();
bool isNull(string leftOrRight);
void setLeft(BTNode<Item>* leftToSet);
void setRight(BTNode<Item>* rightToSet);
void printInclData();
float comparableNumber();
string comparableString();
};
}
#include "BTNode.template"
#endif
很可能
this
是无效指针。该函数在第一次访问 this
的成员时崩溃。尝试将this
与第一封邮件一起打印。
访问"right"时崩溃的事实是调用堆栈中更高位置的错误症状。具体来说,在到达程序的这一点之前,您必须已经做了类似的事情,例如
BNode* node = something->getRight();
node->isNull();
您需要提醒自己,在isNull
函数中,right
和left
是成员变量。它们在内存中的位置是相对于它们所属的BNode实例而言的,它们不仅仅是一些局部变量(这是许多程序员选择用前缀"m_"来区分成员变量的另一个很好的原因,例如"m_left","m_right")。
如果您调用"isNull"的"BNode*"指针不好,那么
记住当您说if(left != NULL)
您正在访问 *(此 + 4 个字节)。您正在"逃脱"访问"左",但不幸的是,"右"位于导致崩溃的某种内存边界的另一侧。
确保:您的构造函数为这些指针分配默认值,您在取消引用之前检查来自 getLeft() 和 getRight() 的返回值,您的复制构造函数不会复制这些值(这意味着有两个节点认为它们在树中的同一位置),并且您的析构函数断言节点是否未取消链接或取消链接节点。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 我可以防止与null与超载运算符==进行比较
- 在将迭代器与C 中的null进行比较时,编译误差
- 重载后的 C++ 与 NULL 的比较 == 运算符
- 我应该将CComBSTR与NULL进行比较吗?
- 将字符串指针与 NULL 以及 NULL 字符进行比较的目的
- 将字符串的地址与 NULL 进行比较
- std::排序将元素与null进行比较
- C++比较运算符重载中第一个参数为 null 时出现分段错误
- 将对象与应等于 NULL 的 NULL 进行比较时出现分段错误
- 用于比较指针到 NULL 的编码标准
- 比较中NULL和零之间的差异
- “operator==”没有匹配项,正在将对象与NULL进行比较
- std::映射比较函数和NULL
- GCC:为什么一行代码中的错误(字符串和NULL的比较)会导致一长串错误消息
- 可以安全地将预先存在的类型转换NULL的返回与较新的nullptr进行比较吗
- 为什么比较成员函数指针为NULL会产生警告?
- 与c++中的Null比较