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.指针操作超过所指向变量的生存期

当指针指向的变量的声明周期已经结束时,如果指针仍然指向这块空间,就会使得该指针成为野指针。这种错误很难防

范,只有养成良好的编程习惯,才能避免这类情况发生。

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

无法判断一个指针是否为野指针,因为野指针本身有值,指向某个内存空间,只是这个值是随机的或错误的。而空指针

具有特殊性和确定性,可以进行判断,因此要避免在程序中出现野指针

C++ -> 在使用动态链表和异质链表产生野指针的步骤的更多相关文章

  1. c++模板编程-异质链表

    概念: 像一个普通的链表结点中,其中成员next通常是指向同类型结点的指针.这就约束了链表中结点必须是同一类型,从而整个链表都只能保存同一类型的数据.而异质链表则是让next指向任何一种类型,也包括存 ...

  2. 基于QT的异质链表实例

    所谓的异质链表就是的节点元素类型能够不同.本实例採用C++抽象类和多态实现. #include <QApplication> #include<QPushButton> #in ...

  3. 【C/C++】动态内存分配和链表

    本文对链表以及C/C++中的动态链表做详细诠释. 什么是链表? 链表是一种重要的数据结构,它最大的优点是可以进行动态的存储分配.链表有单向链表,双向链表,循环链表.对于c,这里我们只讨论单向链表. 我 ...

  4. 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  5. 链表创建和链表遍历算法的演示_C语言

    今天搞了一个多小时,头是疼的,应该是没休息好吧,学习了数据结构这一节,感觉收益良多,下面贴上代码和心得: /*24_链表创建和链表遍历算法的演示*/ # include <stdio.h> ...

  6. JS实现单链表、单循环链表

    链表 链表是一种物理存储单元上非线性.非连续性的数据结构(它在数据逻辑上是线性的),它的每个节点由两个域组成:数据域和指针域.数据域中存储实际数据,指针域则存储着指针信息,指向链表中的下一个元素或者上 ...

  7. JAVA 链表操作:单链表和双链表

    主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...

  8. 数据结构Java实现04----循环链表、仿真链表

    单向循环链表 双向循环链表 仿真链表 一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形 ...

  9. C语言 Linux内核链表(企业级链表)

    //Linux内核链表(企业级链表) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...

随机推荐

  1. STP 生成树协议 RSTP 快速生成树

    STP(Spanning Tree Protocol)是生成树协议的英文缩写 该协议可应用于在网络中建立树形拓扑,消除网络中的环路,并且可以通过一定的方法实现路径冗余,但不是一定可以实现路径冗余.生成 ...

  2. Web渗透测试漏洞手册及修复建议

    Web渗透测试漏洞手册及修复建议 0x0 配置管理 0x01 HTTP方法测试 漏洞介绍: 目标服务器启用了不安全的传输方法,如PUT.DELETE等,这些方法表示可能在服务器上使用了 WebDAV, ...

  3. Hibernate入门之创建数据库表

    前言 Hibernate 5.1和更早版本至少需要Java 1.6和JDBC 4.0,Hibernate 5.2和更高版本至少需要Java 1.8和JDBC 4.2,从本节开始我们正式进入Hibern ...

  4. linux入门系列15--文件传输之vsftp服务

    前面的系列文章基本讲完了linux管理相关的基础知识,从本篇开始讲解centos7中服务程序的部署和配置,以便为外部提供各种服务. 日常工作和娱乐中,我们所需的各种资源都离不开网络以及各种服务,我们通 ...

  5. fastJson&edis

    fastJson&redis 1. fastJson 1.1 依赖 <dependency> <groupId>com.alibaba</groupId> ...

  6. 【redis】基于redis实现分布式并发锁

    基于redis实现分布式并发锁(注解实现) 说明 前提, 应用服务是分布式或多服务, 而这些"多"有共同的"redis"; (2017-12-04) 笑哭, 写 ...

  7. Qt实践基础-简单的登录界面的实现

    主要代码的实现: 1.为了更好的实现界面的组织,采用C++直接构建UI 2.登录多次密码错误则断开“确认”按钮的链接 3.注意理解static变量的应用 4.QString类的使用更像继承了strin ...

  8. MySQL日志文件和InnoDB引擎文件简介

    MySQL和InnoDB的关系不在这里介绍了.但是大家都知道其中相关的文件很多,类型很多.看文件名就有点分布清楚了.所以在这里简单介绍下他们的文件. 我们直接看文件列表以及在后面直接加注释.做笔记. ...

  9. 虚拟机安装_1_wincc_matriton

    1,安装虚拟机: 选择:win7专业版64位ISO. 2,安装office2016 3,激活系统和OFFICE 4,安装winccV7.4 4.1 安装WINDOWS组件 MSMQ 4.1.1 安装I ...

  10. 纪中9日T4 2298. 异或

    2298. 异或 (File IO): input:gcdxor.in output:gcdxor.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 题目描述 Sarv ...