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.指针操作超过所指向变量的生存期
当指针指向的变量的声明周期已经结束时,如果指针仍然指向这块空间,就会使得该指针成为野指针。这种错误很难防
范,只有养成良好的编程习惯,才能避免这类情况发生。
注意:野指针只能避免而无法判断
无法判断一个指针是否为野指针,因为野指针本身有值,指向某个内存空间,只是这个值是随机的或错误的。而空指针
具有特殊性和确定性,可以进行判断,因此要避免在程序中出现野指针
C++ -> 在使用动态链表和异质链表产生野指针的步骤的更多相关文章
- c++模板编程-异质链表
概念: 像一个普通的链表结点中,其中成员next通常是指向同类型结点的指针.这就约束了链表中结点必须是同一类型,从而整个链表都只能保存同一类型的数据.而异质链表则是让next指向任何一种类型,也包括存 ...
- 基于QT的异质链表实例
所谓的异质链表就是的节点元素类型能够不同.本实例採用C++抽象类和多态实现. #include <QApplication> #include<QPushButton> #in ...
- 【C/C++】动态内存分配和链表
本文对链表以及C/C++中的动态链表做详细诠释. 什么是链表? 链表是一种重要的数据结构,它最大的优点是可以进行动态的存储分配.链表有单向链表,双向链表,循环链表.对于c,这里我们只讨论单向链表. 我 ...
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 链表创建和链表遍历算法的演示_C语言
今天搞了一个多小时,头是疼的,应该是没休息好吧,学习了数据结构这一节,感觉收益良多,下面贴上代码和心得: /*24_链表创建和链表遍历算法的演示*/ # include <stdio.h> ...
- JS实现单链表、单循环链表
链表 链表是一种物理存储单元上非线性.非连续性的数据结构(它在数据逻辑上是线性的),它的每个节点由两个域组成:数据域和指针域.数据域中存储实际数据,指针域则存储着指针信息,指向链表中的下一个元素或者上 ...
- JAVA 链表操作:单链表和双链表
主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...
- 数据结构Java实现04----循环链表、仿真链表
单向循环链表 双向循环链表 仿真链表 一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形 ...
- C语言 Linux内核链表(企业级链表)
//Linux内核链表(企业级链表) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...
随机推荐
- k8s系列---部署集群
docer启动出错 [root@centos-minion yum.repos.d]# systemctl start docker Job for docker.service failed bec ...
- 一步步搭建jumpserver
测试推荐环境 CPU: 64位双核处理器 内存: 4G DDR3 数据库:mysql 版本大于等于 5.6 mariadb 版本大于等于 5.5.6 环境 系统: CentOS 7 IP: 192.1 ...
- [Python]random生成随机6位验证码
#!/usr/bin/env pyhton # coding:utf-8 # @Time : 2020-02-16 10:07 # @Author : LeoShi # @Site : # @File ...
- tensorflow开发环境版本组合
记录下各模块的版本 tensorflow 1.15.0 print tf.__version__ cuda 10.0.130 nvcc -v cudnn 7.6.4 ...
- 基于HttpURLConnection的接口调用,支持GET&POST
单位要做一个多级部署平台,大概意思就是一级系统可以监控下属地域的数据也可管理本地的数据.之前做短信猫用过httpClient请求,与此大同小异.封装了一个两种请求方式的工具类. package com ...
- javascript30--day03--Css Variables
相关视频链接:https://www.bilibili.com/video/av8481988/?p=5 相关github地址:https://github.com/soyaine/JavaScri ...
- [Wpf学习] 1.传说中的Main
原来的C#程序都有Main的,现在用vs新建一个Wpf项目,启动似乎变成App.xmal,前期项目中为了获取启动参数,很是折腾了一番: 1.先是修改App.xaml,添加StartUp事件 <A ...
- 微信小程序如何下载超过大小限制(10M)的视频?(苹果用户仔细看,安卓用户快速看)
众所周知,微信小程序对下载的文件大小有限制,目前是最大支持10M.我们在用去水印小程序保存视频的时候,如果遇到长视频,视频大小可能就超过限制.遇到这种情况,我们如何才能把视频保存到手机相册呢? 首先, ...
- MySQL服务器的运维与优化
MySQL运维 安装数据库 配置本地yum源,将gpmall-repo文件上传至/opt目录 创建yum.repo文件 安装mariadb服务 # yum install -y mariadb mar ...
- java Reflection(反射)基础知识讲解
原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...