嘿伙计们我试图运行这段代码,但是当编译器进入类函数时,我会遇到分段错误。
这是主要功能:
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中调用类函数时,我得到了分段错误。
答案 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