2017-03-17 113 views
0

嘿家伙我试图运行这段代码,但当编译器进入类函数时出现段错误。分段错误(核心转储)链表

这是主要的功能:

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; 
    }; 

在类的其他功能类似于这两个,所以他们都会有相同的错误。 主函数运行正确,但是当我在主函数中调用类函数时,我得到了分段错误。

+0

你没有显示你在哪一行得到了段错误 - 但是'createMemory'函数肯定是错误的('temp-> next'没有指向分配和初始化的内存) – UnholySheep

+0

实际上有定义的节点,但是没有头的声明 – MateuszL

+0

忘了说吧。我该如何改变,以指向已初始化的内存?或者我如何初始化内存? –

回答

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

在这个片段中,你用null或初始化TEMP->未来

也许有在你的代码更细微的错误。使用调试器。

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

0

在LinkedList :: createMemory和LinkedList :: addProgram中,您正在函数的作用域中创建一个新节点,但您并未分配这样的新的节点到一个类变量。因此,当您退出功能,您所创建的指针资源丢失:

1)您泄漏的内存,因为你不叫删除指针 2)你的类没有任何节点

一个

node *_root; 

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

现在这个正在这里说的是一对夫妇提示:

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

  • 如果你想拥有一个LinkedList,使用std :: list。

+0

此外,请参阅user274394或Jacec Cz有关代码中其他问题的回答 – Edd

0

'createMemory()'初始化List的方法出现内存分配问题。只有第一个节点分配了内存。您正在将'temp'重新分配给'temp-> next',这没有分配内存,并且访问'temp-> name'会导致'分段错误'。如果以迭代方式创建多个节点,则必须为循环中的每个节点分配内存。使用这个斯坦福链接作为参考,学习如何初始化链接列表:http://cslibrary.stanford.edu/103/LinkedListBasics.pdf