C++ 堆上的用户定义变量在while循环中被销毁

C++ 堆上的用户定义变量在while循环中被销毁,c++,function,linked-list,heap-memory,C++,Function,Linked List,Heap Memory,我遇到了一个奇怪的问题,如果有人能给我指出正确的方向,我将不胜感激。我在堆上创建了自己的链表变量,但当我向其中添加另一个变量时,它们都会被销毁,我不知道为什么。 我主要是这样设置变量 main.cpp Book* temp; temp = bookSetUp(); Book* bookSetUp() { //The items that populate the list Book* a= new Book("A Tale

我遇到了一个奇怪的问题,如果有人能给我指出正确的方向,我将不胜感激。我在堆上创建了自己的链表变量,但当我向其中添加另一个变量时,它们都会被销毁,我不知道为什么。 我主要是这样设置变量
main.cpp

 Book* temp;  
    temp = bookSetUp(); 
      Book* bookSetUp()  
        {  
    //The items that populate the list  
    Book* a= new Book("A Tale of Two Cities", "Charles Dickens", "1", true);  
    Book* b= new Book("Lord of the rings", "J.R.R Tolkein", "2", true);  
    Book* c= new Book("Le Petit Prince", "Antoine de Saint-Exupéry", "3", true);  
    Book* d= new Book("And Then There Were None", "Agatha Christie", "4", true);  
    Book* e= new Book("Dream of the Red Chamber","Cao Xueqin","5", true);  
    Book* f= new Book("The Hobbit","J.R.R Tolkein","6", true);  
    //sets up the pointers between books  
    a->setPrev(NULL);  
    a->setNext(b);  
    b->setPrev(a);  
    b->setNext(c);  
    c->setPrev(b);  
    c->setNext(d);  
    d->setPrev(c);  
    d->setNext(e);  
    e->setPrev(d);  
    e->setNext(f);  
    f->setPrev(e);  
    f->setNext(NULL);  
    //sets up a temp pointer to a  
    Book* temp = a;  
    //returns the temp pointer to a  
    return temp;  
}
else if(checkRegUser(username, password, regUserList) == true)
    {
        int choice = 99;
        cout << "Welcome Registered user: "<< username << endl;
        while(choice != 0)
        {
            //this is so the print will start everytime as if you run it once print will be at NULL thereafter
            Book* print = temp;
            choice = options();
            if(choice == 1)
            {
                while(print!=NULL)
                {
                        cout<<"Name: "<<print->getName()<<endl<<"Author: "<<print->getAuthor()<<endl<<"ISBN: "<<print->getISBN()<<endl<<"Availability: "<<print->getAvail()<<endl;
                        cout<<endl;
                        print = print->getNext();
                }
                print = temp;
            }
            if(choice == 2)
            {
                search(temp);
            }
            if(choice == 3)
            {
                takeOut(temp);
            }
            if(choice == 4)
            {
                returnBack(temp);
            }
            if(choice == 5)
            {
                append(temp);
            }
            if(choice == 6)
            {
                cout<<"Sorry you have the privilege needed to use this function."<<endl;
            }
            if(choice == 7)
            {
                choice = 0;
            }
        }
    }
这将转到另一个名为functions的cpp,它设置如下对象:
功能。cpp

 Book* temp;  
    temp = bookSetUp(); 
      Book* bookSetUp()  
        {  
    //The items that populate the list  
    Book* a= new Book("A Tale of Two Cities", "Charles Dickens", "1", true);  
    Book* b= new Book("Lord of the rings", "J.R.R Tolkein", "2", true);  
    Book* c= new Book("Le Petit Prince", "Antoine de Saint-Exupéry", "3", true);  
    Book* d= new Book("And Then There Were None", "Agatha Christie", "4", true);  
    Book* e= new Book("Dream of the Red Chamber","Cao Xueqin","5", true);  
    Book* f= new Book("The Hobbit","J.R.R Tolkein","6", true);  
    //sets up the pointers between books  
    a->setPrev(NULL);  
    a->setNext(b);  
    b->setPrev(a);  
    b->setNext(c);  
    c->setPrev(b);  
    c->setNext(d);  
    d->setPrev(c);  
    d->setNext(e);  
    e->setPrev(d);  
    e->setNext(f);  
    f->setPrev(e);  
    f->setNext(NULL);  
    //sets up a temp pointer to a  
    Book* temp = a;  
    //returns the temp pointer to a  
    return temp;  
}
else if(checkRegUser(username, password, regUserList) == true)
    {
        int choice = 99;
        cout << "Welcome Registered user: "<< username << endl;
        while(choice != 0)
        {
            //this is so the print will start everytime as if you run it once print will be at NULL thereafter
            Book* print = temp;
            choice = options();
            if(choice == 1)
            {
                while(print!=NULL)
                {
                        cout<<"Name: "<<print->getName()<<endl<<"Author: "<<print->getAuthor()<<endl<<"ISBN: "<<print->getISBN()<<endl<<"Availability: "<<print->getAvail()<<endl;
                        cout<<endl;
                        print = print->getNext();
                }
                print = temp;
            }
            if(choice == 2)
            {
                search(temp);
            }
            if(choice == 3)
            {
                takeOut(temp);
            }
            if(choice == 4)
            {
                returnBack(temp);
            }
            if(choice == 5)
            {
                append(temp);
            }
            if(choice == 6)
            {
                cout<<"Sorry you have the privilege needed to use this function."<<endl;
            }
            if(choice == 7)
            {
                choice = 0;
            }
        }
    }
这非常有效,但稍后我将使用:
main.cpp

 Book* temp;  
    temp = bookSetUp(); 
      Book* bookSetUp()  
        {  
    //The items that populate the list  
    Book* a= new Book("A Tale of Two Cities", "Charles Dickens", "1", true);  
    Book* b= new Book("Lord of the rings", "J.R.R Tolkein", "2", true);  
    Book* c= new Book("Le Petit Prince", "Antoine de Saint-Exupéry", "3", true);  
    Book* d= new Book("And Then There Were None", "Agatha Christie", "4", true);  
    Book* e= new Book("Dream of the Red Chamber","Cao Xueqin","5", true);  
    Book* f= new Book("The Hobbit","J.R.R Tolkein","6", true);  
    //sets up the pointers between books  
    a->setPrev(NULL);  
    a->setNext(b);  
    b->setPrev(a);  
    b->setNext(c);  
    c->setPrev(b);  
    c->setNext(d);  
    d->setPrev(c);  
    d->setNext(e);  
    e->setPrev(d);  
    e->setNext(f);  
    f->setPrev(e);  
    f->setNext(NULL);  
    //sets up a temp pointer to a  
    Book* temp = a;  
    //returns the temp pointer to a  
    return temp;  
}
else if(checkRegUser(username, password, regUserList) == true)
    {
        int choice = 99;
        cout << "Welcome Registered user: "<< username << endl;
        while(choice != 0)
        {
            //this is so the print will start everytime as if you run it once print will be at NULL thereafter
            Book* print = temp;
            choice = options();
            if(choice == 1)
            {
                while(print!=NULL)
                {
                        cout<<"Name: "<<print->getName()<<endl<<"Author: "<<print->getAuthor()<<endl<<"ISBN: "<<print->getISBN()<<endl<<"Availability: "<<print->getAvail()<<endl;
                        cout<<endl;
                        print = print->getNext();
                }
                print = temp;
            }
            if(choice == 2)
            {
                search(temp);
            }
            if(choice == 3)
            {
                takeOut(temp);
            }
            if(choice == 4)
            {
                returnBack(temp);
            }
            if(choice == 5)
            {
                append(temp);
            }
            if(choice == 6)
            {
                cout<<"Sorry you have the privilege needed to use this function."<<endl;
            }
            if(choice == 7)
            {
                choice = 0;
            }
        }
    }
else if(选中Reguser(用户名、密码、regUserList)==true)
{
整数选择=99;

cout*我认为错误出现在代码的这一部分:

 list->setNext(temp);  
您正在“丢失”这些书,因为您在更改列表->下一步之前没有保存它们*


答案不正确,因为条件语句确保它是列表的最后一个元素。对不起!

add
还是
append
?您能准备一个吗?我想我们需要更多的main.btw,这不是您的错误,而是Book*append(Book*tempParam)当你传递一个空列表时,它不起作用。你应该修复它。你将
tempParam
设置为
list
,并在证明后立即返回它(通过
while
循环测试)
列表
为空。main已相应更新,我将修复@RichardPlunkettI也这么认为的问题,但当我调试并返回到main时,列表仍然处于活动状态,直到它“完成”列表被销毁的循环@AFM@Dennington-熊-所以当它退出append函数时,列表仍然包含所有的书?是的。我刚刚检查了那里,现在它工作得很好,因为某些原因我不知道为什么,因为我没有更改任何内容!这让人困惑@AFM谢谢你的帮助哦,实际上我有一个问题虽然在append()中看到了作者的输入?有什么原因吗?如果我键入“Albert Einstein”,它会打印“lbert Einstein”@Dennington bear-它与cin.ignore()有关。我必须查找它的功能。list->setNext(temp);在检查list->getNext()为空后正在执行,那么这将如何导致书籍丢失??