0

我的程序中的一个关键功能遇到了一点问题,我到处都放置了错误测试行,并将其单独归为一条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' 和 'right' 的构造函数中定义为:

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
4

2 回答 2

3

很可能this是一个无效的指针。该函数在第一次this访问成员时崩溃。尝试this与第一条消息一起打印。

于 2013-11-08T08:55:04.750 回答
2

访问“正确”时崩溃的事实是调用堆栈中较高的错误的症状。具体来说,在您的程序到达这一点之前,您必须完成类似的操作,例如

BNode* node = something->getRight();
node->isNull();

你需要提醒自己,在你的isNull函数中rightleft是成员变量。它们在内存中的位置是相对于它们所属的 BNode 的实例而言的,它们不仅仅是一些局部变量(这也是为什么许多程序员选择以“m_”之类的前缀来区分成员变量的另一个很好的原因,例如“m_left”、“ m_right")。

如果你调用“isNull”的“BNode*”指针不好,那么当你说的时候记住这一点会很有帮助

if(left != NULL)

您正在访问 *(this + 4 bytes)。您正在“离开”访问“左侧”,但不幸的是,“右侧”位于某种内存边界的另一侧,导致您的崩溃。

确保:您的构造函数为这些指针分配默认值,您在取消引用之前检查 getLeft() 和 getRight() 的返回值,您的复制构造函数不会复制这些值(这意味着有两个节点认为它们是在树中的同一位置)并且您的析构函数要么断言节点未取消链接,要么取消链接节点。

于 2013-11-08T09:12:12.473 回答