C++ -> 在使用动态链表和异质链表产生野指针的步骤

使用异质链表产生野指针的情况,下面是修改书本的例子:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//ex8_12.cpp                   

#include<iostream.h>

#include<string.h>

#include<assert.h>

#include<iomanip.h>

#include"Employee.h"

#include"Manager.h"

#include"PieceWorker.h"

#include"HourlyWorker.h"

viod AddFront(Employee *&h,Employee*&t){ t->next=h; h=t; }

void test3(){

Employee * empHead=NULL,*ptr;

ptr=new Manager(10135,"Manager",1200);

AddFront(empHead,ptr);

ptr=new HourlyWorker(30712,"HourlyWorker",5,8*20);

AddFront(empHead,ptr);

ptr=new PieceWorker(20382,"PieceWorker",0.5,2850);

AddFront(empHead,ptr);

ptr=empHead;

while(ptr){  ptr->print();  ptr=ptr->next;  }

ptr=empHead;

while(ptr){ cout<<ptr->getNmae()<<" "<<ptr->earnings()<<endl;

                 ptr=ptr->next;    }

}

void main(){  test3();  }

---------------------------------------------------------------------------------------------------修改-----------------------------------------------------------------------------------------------------------------------------------------------------

//ex8_12.cpp                       

#include<iostream.h>

#include<string.h>

#include<assert.h>

#include<iomanip.h>

#include"Employee.h"

#include"Manager.h"

#include"PieceWorker.h"

#include"HourlyWorker.h"

void test1(){  Employee *empHead=NULL, *ptr, *ptr1;    //在什么情况下 指针必须初始才不会产生野指针

 empHead=new Manager(10135,"Manager",120);  

ptr=empHead;  

ptr->next=new HourlyWorker(30712,"HourlyWorker",5,8*20);  

ptr=ptr->next;  

ptr->next=new PieceWorker(20382,"PieceWorker",0.5,2850);  

ptr=ptr->next;  

ptr->next=NULL;                  //缺少这个步骤,在下面的while()循环会造成程序崩溃

 ptr=empHead;  

while(ptr){

cout<<ptr->getName()<<" "<<ptr->getNumber();  //方法1

 cout<<" "<<ptr->earnings()<<endl; ptr=ptr->next;  }

 // do{ cout<<ptr->getName()<<" "<<ptr->getNumber();              //方法2  

// cout<<" "<<ptr->earnings()<<endl; ptr=ptr->next; }while(ptr!=NULL);  

 //for(int i=0;i<3;i++){ cout<<ptr->getName()<<" "<<ptr->getNumber();   

//方法3  //cout<<" "<<ptr->earnings()<<endl;  ptr=ptr->next; } }

void main() {   test1(); }

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

产生野指针的3种情况:

1.指针未初始化

指针变量在定义时不会自动初始化成空指针,而是随机的一个值,可能指向任意空间,这就使得该指针成为野指针。因此指针在初始化时要么指向一个合理的地址,要么初始化为NULL。

2.指针指向的变量被free或delete后没有置为NULL

在调用free或delete释放空间后,指针指向的内容被销毁,空间被释放,但是指针的值并未改变,仍然指向这块内存,这就使得该指针成为野指针。因此在调用free或 delete之后,应将该指针置为NULL。

3.指针操作超过所指向变量的生存期

当指针指向的变量的声明周期已经结束时,如果指针仍然指向这块空间,就会使得该指针成为野指针。这种错误很难防范,只有养成良好的编程习惯,才能避免这类情况发生。

注意:野指针只能避免而无法判断

无法判断一个指针是否为野指针,因为野指针本身有值,指向某个内存空间,只是这个值是随机的或错误的。而空指针具有特殊性和确定性,可以进行判断,因此要避免在程序中出现野指针

猜你喜欢

转载自www.cnblogs.com/WE-ON-LINE/p/11691242.html