使用了可能未初始化的局部指针变量 'node'。 C++

Potentially uninitialized local pointer variable 'node' used. C++

我真的是 C++ 的新手,这段代码是我书中的一个例子,所以它应该可以工作,因为我必须在其中实现一些新功能。但是,我逐行复制了代码,现在我一直收到此错误消息,直到我修复它,我的代码才能编译。

它说我的本地指针'node'正在被使用。我不知道这到底是什么意思。谁能告诉我实际上告诉我的错误是什么?还有人可以帮我解决这个问题,这样我就可以开始我的项目了吗?我只是要代码,因为这不是我项目的一部分,老师已经给了。

这是我的代码:

// ListNode.h
#ifndef _LISTNODE_H
#define _LISTNODE_H

#include <cstdlib>

typedef int ItemType;

class ListNode {
    friend class LList;

public:
    ListNode(ItemType item, ListNode* link = NULL);

private:
    ItemType item_;
    ListNode *link_;
};

inline ListNode::ListNode(ItemType item, ListNode *link)
{
    item_ = item;
    link_ = link;
}

#endif // _LISTNODE_H

// LList.h
#ifndef _LLIST_H
#define _LLIST_H

#include "ListNode.h"

class LList {

public:
    LList();
    LList(const LList& source);
    ~LList();

    LList& operator=(const LList& source);
    int size() { return size_; }
    void append(ItemType x);
    void insert(size_t i, ItemType x);
    ItemType pop(int i = -1);
    ItemType& operator[](size_t position);

private:
    // methods
    void copy(const LList &source);
    void dealloc();
    ListNode* _find(size_t position);
    ItemType _delete(size_t position);

    // data elements
    ListNode *head_;
    int size_;
};

#endif // _LLIST_H

// LList.cpp
#include "LList.h"

LList::LList()
{
    head_ = NULL;
    size_ = 0;
}

ListNode* LList::_find(size_t position)
{
    ListNode *node = head_;
    size_t i;

    for (i = 0; i<position; i++) {
        node = node->link_;
    }
    return node;
}

ItemType LList::_delete(size_t position)
{
    ListNode *node, *dnode;
    ItemType item;

    if (position == 0) {
        dnode = head_;
        head_ = head_->link_;
        item = dnode->item_;
        delete dnode;
    }
    else {
        node = _find(position - 1);
        if (node != NULL) {
            dnode = node->link_;
            node->link_ = dnode->link_;
            item = dnode->item_;
            delete dnode;
        }
    }
    size_ -= 1;
    return item;
}

void LList::append(ItemType x)
{
    ListNode *node, *newNode = new ListNode(x);

    if (head_ != NULL) {
        node = _find(size_ - 1);
        node->link_ = newNode;
    }
    else {
        head_ = newNode;
    }
    size_ += 1;
}

void LList::insert(size_t i, ItemType x)
{
    ListNode *node;

    if (i == 0) {
        head_ = new ListNode(x, head_);
    }
    else {
        node = _find(i - 1);
        node->link_ = new ListNode(x, node->link_);
    }
    size_ += 1;
}

ItemType LList::pop(int i)
{
    if (i == -1) {
        i = size_ - 1;
    }
    return _delete(i);
}

ItemType& LList::operator[](size_t position)
{
    ListNode *node;

    node = _find(position);
    return node->item_;
}

LList::LList(const LList& source)
{
    copy(source);
}

void LList::copy(const LList &source)
{
    ListNode *snode, *node;

    snode = source.head_;
    if (snode) {
        node = head_ = new ListNode(snode->item_);
        snode = snode->link_;
    }
    while (snode) {
        node->link_ = new ListNode(snode->item_);
        node = node->link_;
        snode = snode->link_;
    }
    size_ = source.size_;
}

LList& LList::operator=(const LList& source)
{
    if (this != &source) {
        dealloc();
        copy(source);
    }
    return *this;
}

LList::~LList()
{
    dealloc();
}

void LList::dealloc()
{
    ListNode *node, *dnode;

    node = head_;
    while (node) {
        dnode = node;
        node = node->link_;
        delete dnode;
    }
}

我知道问题到底出在哪里(我的代码中的第 104 行)

node->link_ = new ListNode(snode->item_);

我的这部分代码有问题。谁能帮我解决这个问题,这样我就可以继续我的程序了?谢谢!

既然我以前的问题得到了解答,我又遇到了一个新问题。

我将如何测试我的代码?我有几行,但是当我尝试打印出我的 LList 的内容时,它总是出现错误。这是我的测试代码:

#include "LList.h"

int main()
{
    LList b, c;
    int x;

    b.append(1);
    b.append(2);
    b.append(3);
    c.append(4);
    c.append(5);
    c = b;
    x = b.pop();
} 

任何人都可以帮我写一个有效的测试代码,这是我需要开始添加不同功能的最后一件事。

这可能是因为警告在您的构建中被视为错误。编译器抱怨在访问 node->link 时可能未初始化 node。但是,实际情况并非如此,因为如果 snode 为空,则不会访问 while 块,因此您不会访问未初始化的内存。如果你想让警告消失,将 while 循环放在 if 块中可能会起作用:

snode = source.head_;
if (snode) {
    node = head_ = new ListNode(snode->item_);
    snode = snode->link_;

    while (snode) {
        node->link_ = new ListNode(snode->item_);
        node = node->link_;
        snode = snode->link_;
    }
}

这是一个错误警告,因为编译器似乎认为您将在未分配节点的情况下使用该节点(因为它可能会跳过 if 语句)。在这种情况下,我看不出这是怎么发生的,因为永远不会输入 while (snode)

您可以简单地忽略此警告(在项目设置中禁用将警告视为错误)或从此特定代码部分删除此警告 (#pragma warning(disable : 4703))。

要构建而不将警告视为错误,请转到:项目 -> 属性 -> C/C++ -> 将警告视为错误。禁用此选项或使用 the pragma directives.