为什么函数调用后我的链表被删除了?

时间:2015-12-30 16:31:46

标签: c++ debugging memory-management linked-list

在下面的代码中,我尝试创建一个字符串链表。然后我使用链表来存储由函数(名为myFunction)生成的输出,该函数以递归方式调用自身。在测试/调试代码时,我注意到如果我在执行函数后打印链表的内容(应该将项添加到链表中),则不打印任何内容。但是,如果我在从函数内部添加项目后尝试打印链接列表,它可以正常工作。

在调用myFunction后,似乎删除了整个链表。另一方面,当我向链表添加元素时,我正在使用动态内存分配,所以我没有看到问题。

请帮忙!

#include <cstdlib>
#include <iostream>

template <class T>
class node{
    public:
    node *next;
    T data;
    node(){next=0;};
    void print();
};

template <class T>
void node<T>::print(){
    std::cout << data;
}


template <class T>
class List{
public:
    node<T> *head;
    List(){head=0;};
    void add(T data);
    void print();
    int len();
};

template <class T>
int List<T>::len(){
    int i=0;
    node<T> *current=head;

    while(current!= 0){
        i++;
        current=current->next;
    }
    return i;
};

template <class T>
void List<T>::add(T myData){
    node<T> *current=head;
    if(head==0){
        head= new node<T>;
        head->data=myData;
    }
    else{

        while(current->next!=0){
            current=current->next;
        }

        current->next = new node<T>; 
        current->next->data=myData;
    }
}

template <class T>
void List<T>::print(void){
    node<T> *current=head;
    if(head==0){
        return;
    }
    else{
        do{
            std::cout << current->data << " ";   
            current=current->next;
        }while(current!=0);
    }
}

void myFunction(List<std::string> myList, int n, std::string starter, int leftParens, int rightParens){
    int remainingLength = leftParens+rightParens;
    if(remainingLength==0){
        myList.add(starter);
        std::cout <<myList.len() << std::endl;

    } 
    if(leftParens >0){
        myFunction(myList, n, starter+"(", leftParens-1, rightParens);
    }
    if(leftParens==0 and rightParens >0){
        myFunction(myList, n, starter+")", leftParens, rightParens-1);
    }

}


int main(int argc, char** argv) {

   List<std::string> myList;

   myFunction(myList, 5, "", 5, 5);
   std::cout <<myList.len();

}

2 个答案:

答案 0 :(得分:5)

您按价值将myList传递给myFunction。对函数myList所做的任何更改都是对副本的更改,而不是myList中的原始main

更改myFunction,使其通过引用接受其参数。然后,在myFunction中也可以看到main中对其所做的任何更改。

void myFunction(List<std::string>& myList, int n,
                             //  ^^
                std::string starter, int leftParens, int rightParens){

答案 1 :(得分:2)

  1. 如果要更新调用者上下文中的变量(换句话说,如果要更改<!DOCTYPE html> <html> <head> <script src="jquery-2.1.4.js"></script> <script> $(document).ready(function(){ $("button").click(function(){ $("#div1").load("rao.txt"); }); }); </script> </head> <body> <div id="div1"><h2>Let jQuery AJAX Change This Text</h2></div> <button>Get External Content</button> </body> </html> 中的变量),则需要使用引用。
  2. 每当类分配内存时,您可能需要遵循“三规则”(构造函数,复制构造函数,复制赋值运算符)。如果你不这样做,如果你复制了原来的课程,就会遇到麻烦[就像你现在所说的main的电话一样]