转载:二维数组的动态分配和删除

本文介绍C++中如何正确地动态分配和释放二维数组的方法,包括使用new与delete操作符的注意事项,以及通过malloc和free实现的替代方案。

 二维数组的动态分配和删除 收藏

转载自:

http://blog.youkuaiyun.com/jia_xiaoxin/archive/2008/11/10/3268645.aspx
二维数组的动态分配和删除

  首先,动态支持数组的分配,必须用   new   来进行创建一段堆内存,其它的存贮区域不允许动态分配的产生。  
  其次,C++并没有提供真正的动态多维数组语法,想动态分配数组,必须通过一维动态数组组合形成一个类似多维数组的存贮形式,并不像静态分配多维数组,它们的用法虽说有些地方 有相似之处,但不完全相同。  
  再次,有些网友有一些很BT的分配方式。  
 
  例如:  
  int   (*p)[4] = new int[3][4];  
  解释:可能有些初学者认为这样是可取的,也是利用 new 分配的数组,就可以是动态的,那你的想法就错了,它的分配必须得有最外层 const的支持—  
  int x = 3, y = 4;  
  int (*p)[y] = new int[x][y];//error,y必须是const。  
   
  所以这种方式不能达到真正的动态分配二维数组的目的,只能相当于半自动化的一个分配方式。  
  那么如果依靠下面的这种方式是正确的:  
   
  例:  
  int x = 3, y = 4;  
  int *p = new int*[x];//创建一个动态 int* 型数组  
  for(int i = 0; i < y; ++i)  
      p[i] = new int[x]; //再创建一个动态 int 型数组  

  for (int i = 0; i < y; ++i)  
  {  
      delete p[i];//由里至外,进行释放内存。  
       p[i] = NULL;//不要忘记,释放空间后p[i]不会自动指向NULL值,还将守在原处,只是释放内存而已,仅此而已。  
  }  
  delete []p;  
  p = NULL;  
 
  它就是依靠一维数组的组合来完成,这样创建的动态数组就是一个全自动的个分配方式。  
  例
  void * buf = malloc(x * y * sizeof (int) );   //这也是一个好方法,简单方便,但它是C里面的分配方式。  
  free(buf);//释放内存简单方便.  

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/jia_xiaoxin/archive/2008/11/10/3268645.aspx

模拟一个采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存 储管理、设备管理、文件管理用户接口四部分,要求: 1、 文件管理用户接口 实现的主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护用户接口的实现。 支持多级目录结构,支持文件的绝对读路径。 在图形化界面实现目录树结构,以及文件的路径显示查找等。 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显式链接方式。系统中有两种文件,一种是存放任意字符的普通文本文件,一种是可执行文件。 采用文件分配表 FAT。 把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT)。建立一个FAT数组作为文件分配表。 实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示。 实现图形界面的建立目录、列目录、删除空目录、建立文件、删除文件、显示操作,并对后台进行改变。 文件内容、打开文件、读文件、写文件、关闭文件。实现图形界面的显示文件内容、打开文件、读文件、写文件、关闭文件并对后台进行改变。 命令行界面执行这些命令,也可以采用“右击快捷菜单选择”方式执行命令。 2、 存储管理 储管理部分主要实现内存空间的分配回收、存储保护。用链表模拟内存空间分配表。存储管理采用动态分区存储管理方式,采用首次适配、下次适配、最佳适配均可。 模拟系统中,主存部分分为两部分,一部分是系统区,只存放进程控制块内存分配表,一部分是用户区,存放可执行文件。系统区包括PCB区域(最多容纳10个PCB)、内存空间分配表;用户区用数组模拟,大小为512字节。 屏幕显示要求包括:内存使用情况示意图,以不同的颜色表示哪些区域未分配或已分配(已分配给哪个进程)。 3、 设备管理 设备管理主要包括设备的分配回收。 模拟系统中有A、B、C三种独占型设备,A设备2个,B设备3个,C设备3个。(同一种设备的不同实体被认为是相同的) 设备的申请是由于前述可执行文件中的!??指令引起,有空闲设备时分配设备,然后进程阻塞,同时设备使用倒计时至0后释放设备(不考虑设备具体的I/O操作)并唤醒进程继续运行;无空闲设备时阻塞进程,直至其它进程释放设备时才分配设备并使用,设备使用完后唤醒进程。设备使用倒计时期间,本进程阻塞,需要调度另外一个进程去占用CPU执行;假设设备使用完后立即释放该设备,后续指令需再次使用该设备时重新分配。 不考虑死锁。 屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 4、 进程管理主要包括进程调度,进程的创建撤销、进程的阻塞唤醒,中断作用的实现。 1)硬件工作的模拟 (a)中央处理器的模拟用函数CPU()(该函数没有参数)模拟单个中央处理器。该函数主要负责解释“可执行文件”中的指令。(为简单计,用户命令接口部分实现的命令不必用CPU()解释执行) (b)主要寄存器的模拟用全局变量或数组模拟重要寄存器, (c)中断的模拟I、中断的发现应该是硬件的工作,但在这里,用在函数CPU()中检测PSW的方式来模拟。 (d)时钟的模拟系统时钟相对时钟用全局变量模拟。系统时钟用来记录开机以后的单位时间,相对时钟用来存放进程可运行的时间片 2)进程控制块PCB进程控制块内容包括进程标识符、主要寄存器、进程状态、阻塞原因等。 3)进程调度随机选择前面创建的10个可执行文件之一,创建进程PCB,分配内存,然后逐条执行其中的指令;然后经过随机时间后,再选择一个可执行文件,创建进程……,如此往复,模拟操作系统中进程随机到达的过程。采用时间片轮转调度算法,时间片长度为6。 4)进程控制建立4个函数模拟进程创建、撤销、阻塞唤醒四个原语 5)屏幕显示要求包括:显示系统时钟;显示正在运行进程的进程ID、运行的指令、中间结果(x的当前值)、相对时钟(时间片剩余值);显示就绪队列中进程ID;33显示阻塞队列中进程ID。 二、概要设计 2.1 文件操作 模拟磁盘需要先设计一个类Disk存储磁盘里的信息。因为磁盘有256块,每块有64字节,所以用一个二维的byte数组存储磁盘里的信息。磁盘的信息存储在一个文本文件中,当要操作磁盘时便从文本文件读取内容存放到Disk类的数组中,操作完毕便写入文本文件中。 属性为private byte[][] disk; 文件目录管理需要文件分配表FAT,所以需要一个类FAT来管理文件分配表的改动。因为每个盘块要用一字节表示,而每个盘块有64字节,所以需要disk中的前4个盘块作为文件分配表的内容,所以FAT直接获取Disk中二维数组的引用,操作时直接在数组前四行里操作。 属性为private byte[][] diskBuffer; 需要FileUtil类,用以对磁盘进行各种操作。因为磁盘中存储的都是字节型数据,所以从磁盘中读取内容都是将磁盘中的二进制内容转换为String类型,而写入时则将String型的内容与名字转换为字节型存储到磁盘中。文件或目录的路径是按如下的方法化为二进制的,如路径/ab/cde化为二进制时是转换为数组二进制数组path[][],其中path[0]是 “ab”的Ascii码[97,98],path[1]是”cde”的Ascii码[99,100,101]。属性如下。 private byte[][] diskBuffer; //存储磁盘里的内容 private final int ROOT_DIR = 4; //根目录在磁盘中的盘块 private final byte EXE_PROPERTY = 5; //可执行文件属性 private final byte TXT_PROPERTY = 1; //文本文件属性 private final byte DIR_PROPERTY = 3; //目录属性 private FAT fileAllocationTable; //文件分配表类 private Disk disk; //磁盘类,用以从文件中读取内容 private byte[] emptyBlock; //空盘块 private byte[] emptyItem; //空目录项 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接本声明。 模拟一个采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存 储管理、设备管理、文件管理用户接口四部分,要求: 1、 文件管理用户接口 实现的主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护用户接口的实现。 支持多级目录结构,支持文件的绝对读路径。 在图形化界面实现目录树结构,以及文件的路径显示查找等。 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显式链接方式。系统中有两种文件,一种是存放任意字符的普通文本文件,一种是可执行文件。 采用文件分配表 FAT。 把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT)。建立一个FAT数组作为文件分配表。 实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示。 实现图形界面的建立目录、列目录、删除空目录、建立文件、删除文件、显示操作,并对后台进行改变。 文件内容、打开文件、读文件、写文件、关闭文件。实现图形界面的显示文件内容、打开文件、读文件、写文件、关闭文件并对后台进行改变。 命令行界面执行这些命令,也可以采用“右击快捷菜单选择”方式执行命令。 2、 存储管理 储管理部分主要实现内存空间的分配回收、存储保护。用链表模拟内存空间分配表。存储管理采用动态分区存储管理方式,采用首次适配、下次适配、最佳适配均可。 模拟系统中,主存部分分为两部分,一部分是系统区,只存放进程控制块内存分配表,一部分是用户区,存放可执行文件。系统区包括PCB区域(最多容纳10个PCB)、内存空间分配表;用户区用数组模拟,大小为512字节。 屏幕显示要求包括:内存使用情况示意图,以不同的颜色表示哪些区域未分配或已分配(已分配给哪个进程)。 3、 设备管理 设备管理主要包括设备的分配回收。 模拟系统中有A、B、C三种独占型设备,A设备2个,B设备3个,C设备3个。(同一种设备的不同实体被认为是相同的) 设备的申请是由于前述可执行文件中的!??指令引起,有空闲设备时分配设备,然后进程阻塞,同时设备使用倒计时至0后释放设备(不考虑设备具体的I/O操作)并唤醒进程继续运行;无空闲设备时阻塞进程,直至其它进程释放设备时才分配设备并使用,设备使用完后唤醒进程。设备使用倒计时期间,本进程阻塞,需要调度另外一个进程去占用CPU执行;假设设备使用完后立即释放该设备,后续指令需再次使用该设备时重新分配。 不考虑死锁。 屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 4、 进程管理主要包括进程调度,进程的创建撤销、进程的阻塞唤醒,中断作用的实现。 1)硬件工作的模拟 (a)中央处理器的模拟用函数CPU()(该函数没有参数)模拟单个中央处理器。该函数主要负责解释“可执行文件”中的指令。(为简单计,用户命令接口部分实现的命令不必用CPU()解释执行) (b)主要寄存器的模拟用全局变量或数组模拟重要寄存器, (c)中断的模拟I、中断的发现应该是硬件的工作,但在这里,用在函数CPU()中检测PSW的方式来模拟。 (d)时钟的模拟系统时钟相对时钟用全局变量模拟。系统时钟用来记录开机以后的单位时间,相对时钟用来存放进程可运行的时间片 2)进程控制块PCB进程控制块内容包括进程标识符、主要寄存器、进程状态、阻塞原因等。 3)进程调度随机选择前面创建的10个可执行文件之一,创建进程PCB,分配内存,然后逐条执行其中的指令;然后经过随机时间后,再选择一个可执行文件,创建进程……,如此往复,模拟操作系统中进程随机到达的过程。采用时间片轮转调度算法,时间片长度为6。 4)进程控制建立4个函数模拟进程创建、撤销、阻塞唤醒四个原语 5)屏幕显示要求包括:显示系统时钟;显示正在运行进程的进程ID、运行的指令、中间结果(x的当前值)、相对时钟(时间片剩余值);显示就绪队列中进程ID;33显示阻塞队列中进程ID。 二、概要设计 2.1 文件操作 模拟磁盘需要先设计一个类Disk存储磁盘里的信息。因为磁盘有256块,每块有64字节,所以用一个二维的byte数组存储磁盘里的信息。磁盘的信息存储在一个文本文件中,当要操作磁盘时便从文本文件读取内容存放到Disk类的数组中,操作完毕便写入文本文件中。 属性为private byte[][] disk; 文件目录管理需要文件分配表FAT,所以需要一个类FAT来管理文件分配表的改动。因为每个盘块要用一字节表示,而每个盘块有64字节,所以需要disk中的前4个盘块作为文件分配表的内容,所以FAT直接获取Disk中二维数组的引用,操作时直接在数组前四行里操作。 属性为private byte[][] diskBuffer; 需要FileUtil类,用以对磁盘进行各种操作。因为磁盘中存储的都是字节型数据,所以从磁盘中读取内容都是将磁盘中的二进制内容转换为String类型,而写入时则将String型的内容与名字转换为字节型存储到磁盘中。文件或目录的路径是按如下的方法化为二进制的,如路径/ab/cde化为二进制时是转换为数组二进制数组path[][],其中path[0]是 “ab”的Ascii码[97,98],path[1]是”cde”的Ascii码[99,100,101]。属性如下。 private byte[][] diskBuffer; //存储磁盘里的内容 private final int ROOT_DIR = 4; //根目录在磁盘中的盘块 private final byte EXE_PROPERTY = 5; //可执行文件属性 private final byte TXT_PROPERTY = 1; //文本文件属性 private final byte DIR_PROPERTY = 3; //目录属性 private FAT fileAllocationTable; //文件分配表类 private Disk disk; //磁盘类,用以从文件中读取内容 private byte[] emptyBlock; //空盘块 private byte[] emptyItem; //空目录项 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接本声明。 模拟一个采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存 储管理、设备管理、文件管理用户接口四部分,要求: 1、 文件管理用户接口 实现的主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护用户接口的实现。 支持多级目录结构,支持文件的绝对读路径。 在图形化界面实现目录树结构,以及文件的路径显示查找等。 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显式链接方式。系统中有两种文件,一种是存放任意字符的普通文本文件,一种是可执行文件。 采用文件分配表 FAT。 把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT)。建立一个FAT数组作为文件分配表。 实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示。 实现图形界面的建立目录、列目录、删除空目录、建立文件、删除文件、显示操作,并对后台进行改变。 文件内容、打开文件、读文件、写文件、关闭文件。实现图形界面的显示文件内容、打开文件、读文件、写文件、关闭文件并对后台进行改变。 命令行界面执行这些命令,也可以采用“右击快捷菜单选择”方式执行命令。 2、 存储管理 储管理部分主要实现内存空间的分配回收、存储保护。用链表模拟内存空间分配表。存储管理采用动态分区存储管理方式,采用首次适配、下次适配、最佳适配均可。 模拟系统中,主存部分分为两部分,一部分是系统区,只存放进程控制块内存分配表,一部分是用户区,存放可执行文件。系统区包括PCB区域(最多容纳10个PCB)、内存空间分配表;用户区用数组模拟,大小为512字节。 屏幕显示要求包括:内存使用情况示意图,以不同的颜色表示哪些区域未分配或已分配(已分配给哪个进程)。 3、 设备管理 设备管理主要包括设备的分配回收。 模拟系统中有A、B、C三种独占型设备,A设备2个,B设备3个,C设备3个。(同一种设备的不同实体被认为是相同的) 设备的申请是由于前述可执行文件中的!??指令引起,有空闲设备时分配设备,然后进程阻塞,同时设备使用倒计时至0后释放设备(不考虑设备具体的I/O操作)并唤醒进程继续运行;无空闲设备时阻塞进程,直至其它进程释放设备时才分配设备并使用,设备使用完后唤醒进程。设备使用倒计时期间,本进程阻塞,需要调度另外一个进程去占用CPU执行;假设设备使用完后立即释放该设备,后续指令需再次使用该设备时重新分配。 不考虑死锁。 屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 4、 进程管理主要包括进程调度,进程的创建撤销、进程的阻塞唤醒,中断作用的实现。 1)硬件工作的模拟 (a)中央处理器的模拟用函数CPU()(该函数没有参数)模拟单个中央处理器。该函数主要负责解释“可执行文件”中的指令。(为简单计,用户命令接口部分实现的命令不必用CPU()解释执行) (b)主要寄存器的模拟用全局变量或数组模拟重要寄存器, (c)中断的模拟I、中断的发现应该是硬件的工作,但在这里,用在函数CPU()中检测PSW的方式来模拟。 (d)时钟的模拟系统时钟相对时钟用全局变量模拟。系统时钟用来记录开机以后的单位时间,相对时钟用来存放进程可运行的时间片 2)进程控制块PCB进程控制块内容包括进程标识符、主要寄存器、进程状态、阻塞原因等。 3)进程调度随机选择前面创建的10个可执行文件之一,创建进程PCB,分配内存,然后逐条执行其中的指令;然后经过随机时间后,再选择一个可执行文件,创建进程……,如此往复,模拟操作系统中进程随机到达的过程。采用时间片轮转调度算法,时间片长度为6。 4)进程控制建立4个函数模拟进程创建、撤销、阻塞唤醒四个原语 5)屏幕显示要求包括:显示系统时钟;显示正在运行进程的进程ID、运行的指令、中间结果(x的当前值)、相对时钟(时间片剩余值);显示就绪队列中进程ID;33显示阻塞队列中进程ID。 二、概要设计 2.1 文件操作 模拟磁盘需要先设计一个类Disk存储磁盘里的信息。因为磁盘有256块,每块有64字节,所以用一个二维的byte数组存储磁盘里的信息。磁盘的信息存储在一个文本文件中,当要操作磁盘时便从文本文件读取内容存放到Disk类的数组中,操作完毕便写入文本文件中。 属性为private byte[][] disk; 文件目录管理需要文件分配表FAT,所以需要一个类FAT来管理文件分配表的改动。因为每个盘块要用一字节表示,而每个盘块有64字节,所以需要disk中的前4个盘块作为文件分配表的内容,所以FAT直接获取Disk中二维数组的引用,操作时直接在数组前四行里操作。 属性为private byte[][] diskBuffer; 需要FileUtil类,用以对磁盘进行各种操作。因为磁盘中存储的都是字节型数据,所以从磁盘中读取内容都是将磁盘中的二进制内容转换为String类型,而写入时则将String型的内容与名字转换为字节型存储到磁盘中。文件或目录的路径是按如下的方法化为二进制的,如路径/ab/cde化为二进制时是转换为数组二进制数组path[][],其中path[0]是 “ab”的Ascii码[97,98],path[1]是”cde”的Ascii码[99,100,101]。属性如下。 private byte[][] diskBuffer; //存储磁盘里的内容 private final int ROOT_DIR = 4; //根目录在磁盘中的盘块 private final byte EXE_PROPERTY = 5; //可执行文件属性 private final byte TXT_PROPERTY = 1; //文本文件属性 private final byte DIR_PROPERTY = 3; //目录属性 private FAT fileAllocationTable; //文件分配表类 private Disk disk; //磁盘类,用以从文件中读取内容 private byte[] emptyBlock; //空盘块 private byte[] emptyItem; //空目录项 ———————
最新发布
07-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值