C++ -> 在使用动态链表和异质链表产生野指针的步骤
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; //缺少这个步骤,此后ptr就是野指针,在下面的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.指针操作超过所指向变量的生存期
当指针指向的变量的声明周期已经结束时,如果指针仍然指向这块空间,就会使得该指针成为野指针。这种错误很难防
范,只有养成良好的编程习惯,才能避免这类情况发生。
注意:野指针只能避免而无法判断
无法判断一个指针是否为野指针,因为野指针本身有值,指向某个内存空间,只是这个值是随机的或错误的。而空指针
具有特殊性和确定性,可以进行判断,因此要避免在程序中出现野指针
最新文章
- ASP.NET知识总结(4.请求管道中的19个事件)
- 关于Android中查看app安装时间等信息的问题
- React入门--------组件的生命周期
- maven安装配置(myeclipse)(一)
- virtIO驱动安装
- javascript系列之核心知识点(二)
- SQLServer中的变量:局部变量,全局变量
- UML基础概念(转)
- 201521123067 《Java程序设计》第8周学习总结
- 模板文件引入css样式文件
- 【转】12 TOP Command Examples in Linux
- java通过反射获取字段的类型
- 关于Spring的Quartz定时器设定
- 018.07 New BMW ICOM A3+B+C+D Plus EVG7 Controller Tablet PC with WIFI Function
- C++调用IDL程序的做法(三)
- T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他
- poj2492 A Bug's Life【并查集】
- python-day71--django多表操作
- HDFS配额管理指南
- mongoDB在windows64上安装