使用了可能未初始化的局部指针变量 '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.
我真的是 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.