分段错误(核心转储)链表

时间:2017-03-17 08:32:08

标签: c++ linked-list

嘿伙计们我试图运行这段代码,但是当编译器进入类函数时,我会遇到分段错误。

这是主要功能:

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

    cout<<"\t1.Add Program\n";
    cout<<"\t2.Kill Program\n";
    cout<<"\t3.Fragmentation\n";
    cout<<"\t4.Print Memory\n";
    cout<<"\t5.Exit"<<endl;

    LinkedList Memory;
    Memory.createMemory();   (I get the segmentation error on this line)


    int choice;
    cin>>choice;
    cout<<"choice - "<<choice<<endl;

    if  (choice==1){
        string programName;
        cin>>programName;
        cout<<"Program name - "<<programName<<endl;

        int size;
        cin>>size;
        cout<<"Program size (KB) - "<<size<<endl;

        int numpages;
        if (size%4==0) numpages=size/4;
        if (size%4!=0) numpages=size/4+1;

        Memory.addProgram(numpages, programName);
        return 0;
    }

这是班级

 class LinkedList{
 private:
     struct node{
         string name;
         node *next;
      };
 public:
      void createMemory();
      void addProgram(int val, string s);
      void killProgram(string s1);
      void print();
      void fragmentation();
      LinkedList(){head=NULL;};
  };

这是两个类函数

 void LinkedList::createMemory(){
    int i=0;
    node* temp;
    temp = new node;
    while(i<32){
        temp->name="Free";
        temp=temp->next;
        i++;
    }
    };



    void LinkedList::addProgram(int val, string s){
    int i=0;
    node* temp;
    temp=new node;
    while(temp->name!="Free")
        temp=temp->next;

    while(temp->name=="Free"){
        while (i<val){
            temp->name=s;
            temp=temp->next;
            i++;
        }
    }
    cout<<"Program "<<s<<" added successfully: "<<val<<" page(s) used."<<endl;
    };

班级中的其他功能与这两个类似,所以他们都会遇到同样的错误。 主函数运行正常,但是当我在main中调用类函数时,我得到了分段错误。

3 个答案:

答案 0 :(得分:1)

while(i<32){
        temp->name="Free";
        temp=temp->next;
        i++;
    }

在此代码段中,您使用null或未初始化的temp-&gt; next

您的代码中可能存在更微妙的错误。使用调试器。

提示始终要记住:在构造函数中初始化所有成员,而不仅仅是选中。 在我的代码中,我也使用struct的构造函数(否则有人建议)

答案 1 :(得分:0)

在LinkedList :: createMemory和LinkedList :: addProgram中,您正在函数范围内创建一个新节点,但您没有将这样的新节点分配给类变量。因此,当您退出函数时,指向您创建的资源的指针将丢失,并且:

1)你泄漏了记忆,因为你没有在指针上调用删除 2)你的班级没有任何节点

添加

node *_root; 

变量到您的LinkedList类并分配给它。

现在,这里有一些提示:

  • 不要像这样使用 new ,它很容易泄漏内存。使用std :: unique_ptr以便自动清除资源。

  • 如果您想拥有LinkedList,请使用std :: list。

答案 2 :(得分:0)

'createMemory()'初始化List的方法遇到内存分配问题。只有第一个节点分配了内存。您正在使用'temp-&gt; next'重新分配'temp',它没有分配内存并访问'temp-&gt; name',这将导致'Segmentation fault'。如果要以迭代方式创建多个节点,则必须为循环中的每个节点分配内存。使用此stanford链接作为参考,以了解如何初始化链接列表:http://cslibrary.stanford.edu/103/LinkedListBasics.pdf