使用了潜在的未初始化的本地指针变量“node”。 C ++

时间:2015-04-20 13:25:25

标签: c++ pointers linked-list

我对C ++很陌生,这段代码在我的书中是一个例子,所以它应该可以工作,因为我必须在这里实现一些新功能。但是,我复制了代码行for line,我不断收到此错误消息,现在我的代码不会编译,直到我修复它。

它说我的本地指针'节点'正在使用。我不知道这究竟意味着什么。谁能告诉我什么是实际告诉我的错误?也有人可以帮我解决这个问题,这样我可以开始我的项目吗?我只是要求代码,因为这不是我项目的一部分,它已由老师提供。

这是我的代码:

// 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();
} 

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

2 个答案:

答案 0 :(得分:3)

这可能是由于警告被视为构建中的错误。编译器抱怨在访问node时可能无法初始化node->link。但实际情况并非如此,因为如果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_;
    }
}

答案 1 :(得分:0)

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

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

要构建而不处理警告,因为错误转到:项目 - &gt;属性 - &gt; C / C ++ - &gt;将警告视为错误。禁用此选项或使用the pragma directives