Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链表故障_C++ - Fatal编程技术网

C++ 链表故障

C++ 链表故障,c++,C++,在visual Studio的最新版本中,此错误正在运行,尝试使用makefile发送到学校服务器,valgrind上的此错误在尝试将int添加到空列表时在进程第一个headPtr==nullptr时停止 断层 它说要添加更多细节,所以我想我会继续写,直到它让我提交,我不知道还有什么要说的,如果有人想尝试运行它,我有菜单和有效的驱动程序功能,但测试可以不用它们 #include "list.hpp" int main() { menu(); } list: main.o list.o

在visual Studio的最新版本中,此错误正在运行,尝试使用makefile发送到学校服务器,valgrind上的此错误在尝试将int添加到空列表时在进程第一个headPtr==nullptr时停止

断层

它说要添加更多细节,所以我想我会继续写,直到它让我提交,我不知道还有什么要说的,如果有人想尝试运行它,我有菜单和有效的驱动程序功能,但测试可以不用它们

#include "list.hpp"

int main()
{
    menu();
}
list: main.o list.o valid.o menu.o  node.o  
    g++ -std=c++0x -g main.o list.o valid.o menu.o  node.o   -o list
main.o: main.cpp
    g++ -std=c++0x -g -c main.cpp
node.o: node.cpp 
    g++ -std=c++0x -g -c node.cpp

list.o: list.cpp
    g++ -std=c++0x -g -c list.cpp


menu.o: menu.cpp 
    g++ -g -std=c++0x -c menu.cpp

valid.o: valid.cpp 
    g++ -g -c -std=c++0x valid.cpp
clean:
    rm *.o list
瓦尔格林误差

[1]:https://i.stack.imgur.com/MM9az.png
#包括“list.hpp”
列表::列表()
{
节点*headPtr=nullptr;
节点*tailPtr=nullptr;
}
列表::~List()
{
if(headPtr!=nullptr)
{
while(headPtr!=nullptr)
{
节点*toDel=headPtr;
headPtr=headPtr->getNext();
删除托德尔;
}
}
}
无效列表::addHead(int-add)
{
Node*nodePtr=新节点;
Node*nll=nullptr;
nodePtr->setVal(add);//放入数据
nodePtr->setPrev(nll);//始终执行->使prev(在新头之前)为空,就像现在的新头一样
if(headPtr==nullptr)//空列表
{
nodePtr->setNext(nll);//next-prev的值已为空
headPtr=nodePtr;//仅节点集head
tailPtr=nodePtr;//设置tail
}
else//节点已存在
{
nodePtr->setNext(headPtr);//新头的下一个是旧头
(headPtr)->setPrev(nodePtr);//prev旧头新头
headPtr=nodePtr;//更改headPtr
}
导线();
}
void List::addTail(int add)//获取指向尾部节点的指针
{
Node*nll=nullptr;
Node*nodePtr=新节点;
nodePtr->setNext(nll);//将是最后一个节点
nodePtr->setVal(add);//放入数据
如果(tailPtr==nullptr)
{
headPtr=nodePtr;//仅节点集head
tailPtr=nodePtr;
nodePtr->setPrev(nll);//那里什么都没有
}
其他的
{
nodePtr->setPrev(tailPtr);
tailPtr->setNext(nodePtr);
tailPtr=nodePtr;
}
导线();
}
/*if(headPtr!=NULL)//如果这不是添加的第一个元素
{//然后将新节点粘贴到列表b4交换头的开头
(headPtr)->setPrev(nodePtr);
}
headPtr=nodePtr//将磁头重置为新节点
如果(tailPtr==NULL)
{
tailPtr=nodePtr;//如果第一个节点设置了tail
}*/
/*
tailPtr->setNext(nodePtr)//链接到旧尾巴->新尾巴
}
tailPtr=nodePtr;
如果(headPtr==NULL)
{
headPtr=nodePtr;//如果第一个元素
}*/
void List::delFirst()
{
Node*nll=nullptr;
如果(headPtr==nullptr)
{
std::cout getPrev()==nullptr)//仅一个节点
{
删除headPtr;
headPtr=nullptr;
tailPtr=nullptr;
}
其他的
{
//节点*tmp=headPtr;
headPtr=(headPtr)->getNext();
删除headPtr->getPrev();
headPtr->setPrev(nll);
}
导线测量();
}
无效列表::delLast()
{
Node*nll=nullptr;
if(tailPtr==nullptr)//空
{
std::cout getPrev()==nullptr)//仅一个节点?
{
删除tailPtr;
headPtr=nullptr;
tailPtr=nullptr;
}
其他的
{   
tailPtr=(tailPtr)->getPrev();//向后移动一个
删除tailPtr->getNext();
tailPtr->setNext(nll);
}
导线();
}
无效列表::reverseTrav()
{
节点*tmp=tailPtr;
如果(tmp==nullptr)
{

瓦尔格林正试图告诉你答案!如果你曾经看到:

条件跳转或移动取决于未初始化的值

你几乎肯定做错了什么。在这种情况下,Valgrind所说的是:

if (headPtr == nullptr)//empty list
但是您初始化了
headPtr
…不是吗?让我们看看您的构造函数:

List::List()
{
    Node* headPtr = nullptr;
    Node* tailPtr = nullptr;
}
uh哦!你创建了两个新的代码<代码>节点*/CUT>,并将它们设置为<代码> NulLPTR< /C>,但你永远不能修改<代码>头PTR <代码>和<代码> TrpTrt<代码>你的类成员!记住C++中可以通过在子范围中声明一个新的相同的名称来轻易地隐藏变量。 删除构造函数中的
节点*
,这样您就可以实际初始化成员变量,或者更好地使用字段初始化列表,这样您就不用担心这个问题了

List::List() : headPtr(nullptr), tailPtr(nullptr) { }

天哪,昨晚你在哪里:0你是我的救世主!@DavePassaro哈哈,很高兴能帮上忙!@DavePassaro Valgrind确实在告诉你这个问题……但是你可以让编译器告诉你这些事情,你不需要Valgrind来做这个。
-Wshadow
特别是对于gcc。甚至可能是在
-Wall
中。要意识到的是我在构造函数中,您创建了两个名为headPtr和tailPtr的东西,它们与类的成员字段无关。如果您提高警告级别,您可能会收到一条警告,表明您屏蔽了类变量。停止手动内存管理(
new
/
delete
)了解智能指针和标准库中已经可以使用的所有容器类。这就像90年代的C++ Fron。这不是现代C++的方式。
List::List() : headPtr(nullptr), tailPtr(nullptr) { }