无法初始化某些指针,在运行时中断程序

时间:2018-01-27 07:12:32

标签: c++ templates pointers

我一直在关注二元树上的一行教程,而且我对模板和抽象类仍然很陌生。

我声明了3个指向节点struct,* current,* trail和* newNode的指针,然后分配它们。

当然,我在声明时尝试将这三个指针设置为 nullptr ,但它会在运行时断开该行上的程序。

我得到的错误是:

"潜在的未初始化的本地指针变量' trail'使用"

未初始化的局部变量" newNode"使用。

功能:

template<class elemType>
void searchTree<elemType>::insert(const elemType& item)
{
    nodeType<elemType> *current, *trail, *newNode;
    newNode->info = item; // Cant assign, first error
    newNode->leftLink = NULL;
    newNode->rightLink = NULL;
    if (root == NULL)
        root = newNode;
    else
    {
        current = root;
        while (current != NULL)
        {
            trail = current;
            if (current->info == item)
            {
                cout << "Item is already in tree, no duplicates." << endl;
                return;
            }
            else if (current->info > item)
                current = current->leftLink;
            else
                current = current->rightLink;
        }
        if (trail->info > item) // second error
            trail->leftLink = newNode;
        else
            trail->rightLink = newNode;

    }

}

我已经在这里:Potentially uninitialized local pointer variable 'node' used. C++

我尝试了包括

在内的所有建议
#pragma warning(disable : 4703)

但指针仍然没有初始化,它仍然在那条线上打破。

任何建议(或指针)都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为

是指针的新手
nodeType<elemType> *current, *trail, *newNode;

此时newNode没有任何价值,它“点”无处可见

newNode->info = item;

此时您使用newNode的无意义值。这是您的编译器警告的内容。

你需要做的是这样的事情

nodeType<elemType> *current, *trail, *newNode;
newNode = new nodeType<elemType>(); // make newNode point at a new node
newNode->info = item;
newNode->leftLink = NULL;
newNode->rightLink = NULL;

第二个警告是虚假的。编译器担心你永远不会执行while循环的主体,因此可能无法初始化跟踪。但是你编写代码的方式while循环总是至少执行一次。要删除警告,您可以将while循环重写为do ... while循环。

    do
    {
        trail = current;
        if (current->info == item)
        {
            cout << "Item is already in tree, no duplicates." << endl;
            return;
        }
        else if (current->info > item)
            current = current->leftLink;
        else
            current = current->rightLink;
    }
    while (current != NULL);

这样编译器就会知道正在初始化路径。