动态内存分配

合集下载

c++内存分配机制

c++内存分配机制

C++的内存分配机制可以分为四个区域:堆区、栈区、全局/静态存储区和常量存储区。

1. 堆区:动态内存分配区,程序在运行时可以向该区域申请一定大小的内存,用malloc或new来申请,用free或delete来释放。

2. 栈区:存放函数的参数值和局部变量,由编译器自动分配和释放,其操作方式类似于数据结构中的栈。

3. 全局/静态存储区:全局变量和静态变量被存放在此区域中,包括初始化的全局变量和静态变量(空白初始化的全局变量和静态变量也会被存放在此区域),全局变量和静态变量在程序整个运行期间一直被保留。

4. 常量存储区:常量被存放在此区域中,不允许修改。

C++内存分配机制遵循二八定律,即80%的内存空间被80%的程序所使用,而剩下的20%的内存空间则被浪费。

因此,在编写C++程序时,应该尽可能地利用好内存空间,避免内存空间的浪费。

C语言内存管理与安全性

C语言内存管理与安全性

C语言内存管理与安全性在计算机科学领域,C语言是一门被广泛使用的编程语言,因为其高效性和灵活性而受到开发者的青睐。

然而,C语言也存在一些特殊问题,尤其是与内存管理和安全性相关的问题。

本文将探讨C语言的内存管理原则、内存泄露、缓冲区溢出等安全性问题,并提供相应的解决方案。

一、内存管理原则在C语言中,内存管理是程序员应该特别关注的重要的任务之一。

以下是一些C语言内存管理的基本原则:1. 动态内存分配:C语言中,程序员可以使用malloc()和free()函数来动态分配和释放内存。

动态内存分配可以根据程序的需要进行灵活的内存管理。

2. 避免内存泄露:内存泄露是指程序在分配内存后没有释放该内存,造成内存浪费的现象。

为了避免内存泄露,程序员需要在适当的时候调用free()函数来释放已分配的内存。

3. 内存一致性:内存一致性是指程序访问的内存地址是有效且可靠的。

程序员需要遵循规定的读写内存的顺序以确保内存一致性。

4. 常量内存:C语言中,程序员可以使用const关键字来声明常量,以防止对常量内存的非法修改。

二、内存泄露内存泄露是C语言中常见的问题之一,它会导致程序占用过多的内存资源,影响程序的性能。

以下是一些常见的原因和解决方案:1. 未释放内存:程序员需要确保在不再使用动态分配的内存时,及时使用free()函数释放该内存。

同时,程序中应避免在释放内存后仍然使用这些内存空间。

2. 循环引用:当存在循环引用时,即两个或多个对象之间相互引用,而没有其他引用指向它们时,会导致内存泄露。

此时,可以使用适当的引用计数算法来解决循环引用导致的内存泄露问题。

三、缓冲区溢出缓冲区溢出是C语言中的一种常见安全性问题。

当程序写入超过缓冲区容量的数据时,会导致数据覆盖其他内存地址,从而引发安全漏洞。

以下是一些常见的原因和解决方案:1. 字符串处理:在C语言中,字符串处理时需要格外小心,使用strncpy()函数来确保不会发生缓冲区溢出。

malloc的用法和意义

malloc的用法和意义

malloc的用法和意义1. 什么是malloc?malloc是C语言中的一个库函数,用于动态分配内存空间。

它的全称是memory allocation(内存分配)。

通过调用malloc函数,我们可以在程序运行时根据需要申请指定大小的内存块,并返回一个指向该内存块起始地址的指针。

2. malloc的用法malloc函数的用法如下所示:#include <stdlib.h>void* malloc(size_t size);其中,size参数表示需要分配的内存空间大小,单位是字节。

malloc函数返回一个void*类型的指针,指向分配的内存空间的起始地址。

具体的使用步骤如下:1.包含头文件<stdlib.h>,该头文件中包含了malloc函数的声明。

2.调用malloc函数,并传入需要分配的内存空间大小作为参数。

3.检查malloc函数的返回值,如果返回值为NULL,则表示分配失败,可能是内存不足。

如果返回值不为NULL,则表示分配成功。

4.使用返回的指针访问分配的内存空间。

5.在不需要使用分配的内存空间时,使用free函数释放内存。

下面是一个使用malloc函数动态分配内存的示例代码:#include <stdio.h>#include <stdlib.h>int main() {int* ptr;int n, i;printf("Enter the number of elements: ");scanf("%d", &n);// 动态分配内存空间ptr = (int*)malloc(n * sizeof(int));// 检查分配是否成功if (ptr == NULL) {printf("Memory allocation failed!\n");exit(1);}// 读取输入数据printf("Enter elements: ");for (i = 0; i < n; i++) {scanf("%d", &ptr[i]);}// 输出数据printf("Elements: ");for (i = 0; i < n; i++) {printf("%d ", ptr[i]);}// 释放内存free(ptr);return 0;}3. malloc的意义malloc函数在C语言中具有重要的意义,其主要体现在以下几个方面:3.1 动态内存分配malloc函数可以根据程序的实际需要,在运行时动态分配内存空间。

malloc分配内存的算法

malloc分配内存的算法

malloc分配内存的算法
malloc是一个动态内存分配函数,它可以在程序运行时动态地
分配所需的内存空间。

malloc的算法首先会为要分配的内存块找到
一个合适的空闲区块,然后将该区块标记为已经使用。

标记的方式通常是在该内存块前面加上一个特定的标记符号,表示该内存块已经被使用。

同时,malloc还需要记录已经分配的内存块的大小以及其地址,以便在后续使用中进行管理和释放。

当需要分配内存时,malloc会在已经分配的内存块中寻找一个
合适的块来存放新的数据。

为了寻找合适的块,malloc会按照一定
的算法对内存块进行排序,以便更快地找到合适的空闲块。

常用的算法有首次适应算法、最佳适应算法和最坏适应算法。

首次适应算法是从内存的起始地址开始搜索空闲块,找到第一个满足要求的块即可分配。

这种算法简单易懂,但是容易产生“内部碎片”,即分配的内存块留下的空余空间过小,无法再次被其他较大的
内存块使用。

最佳适应算法是按照内存块的大小从小到大进行排序,然后寻找能够容纳所需内存的最小块进行分配。

这种算法可以最大限度地利用内存块,但是在内存碎片的情况下,可能会导致搜索时间过长,影响性能。

最坏适应算法则是按照内存块的大小从大到小进行排序,然后寻找能够容纳所需内存的最大块进行分配。

这种算法可以减少内存碎片,但是同样可能导致搜索时间过长。

总之,malloc的算法是为了最大限度地利用内存空间,减少内存碎片的产生,并且要保证分配的内存块大小和地址可以被管理和释放。

在选择算法时,需要根据实际的内存使用情况来选择,以便达到最优的性能和效率。

内存的申请和释放

内存的申请和释放

内存的申请和释放一、内存的申请在计算机程序运行过程中,内存的申请是为了存储程序执行中所需要的数据和变量。

当程序需要内存时,可以使用以下两种方式申请内存。

1.静态内存分配静态内存分配是在程序编译阶段就进行的内存分配,使用静态变量或全局变量来申请内存。

这种方式的内存是在程序运行前就分配好的,程序运行期间不会释放或重新分配。

静态内存分配的好处是内存管理简单,但缺点是内存空间固定,无法动态调整,不够灵活。

2.动态内存分配动态内存分配是在程序运行时根据需要申请内存,通常使用堆(heap)来存储动态分配的内存。

动态内存分配使用C/C++中的new和delete操作符,或者C语言中的malloc(和free(函数来完成。

动态内存分配的好处是可以根据需要灵活地申请和释放内存,但需要程序员手动管理内存,否则容易出现内存泄露或内存溢出的问题。

二、内存的释放内存的释放是指程序完成对块内存的使用后将其返回给操作系统。

释放内存的主要目的是为了回收内存资源,以供其他程序使用。

内存的释放可以使用以下两种方式。

1.遵循申请和释放的原则为了避免内存泄露,程序员需要遵循一定的申请和释放原则。

每次申请内存后,一定要记得在不需要使用该内存时及时释放它。

否则,内存将一直占用,直到程序结束,造成内存资源的浪费。

2.调用相应的释放函数遵循申请和释放的原则后,需要调用相应的释放函数来释放内存。

在C语言中,使用free(函数来释放动态分配的内存。

在C++中,使用delete操作符来释放通过new操作符申请的内存,或使用delete[]操作符来释放通过new[]操作符申请的动态数组内存。

释放内存后,应将指针设置为NULL,以避免出现野指针的情况。

三、注意事项在进行内存的申请和释放时,还需注意以下几点。

1.内存泄露内存泄露是指在程序运行中,申请了内存但没有及时释放导致内存资源的浪费。

为避免内存泄露,在申请内存后一定要注意及时释放内存。

2.野指针野指针是指指向已被释放的内存或者未被初始化的指针。

头歌数据结构课程设计答案链表动态内存分配

头歌数据结构课程设计答案链表动态内存分配

头歌数据结构课程设计答案链表动态内存分配对于链表的动态内存分配,可以采用以下方法:1. 首先需要定义一个链表结构体,包括数据元素和后继指针。

2. 通过调用malloc函数实现动态内存分配,分配所需的节点内存。

3. 在节点内存中存储数据元素和后继指针信息。

4. 将新分配的节点插入到链表中,更新前驱节点的后继指针和当前节点的后继指针。

5. 删除节点时,先保存下一个节点的地址,然后释放当前节点的内存,再将前驱节点的后继指针指向下一个节点。

以下是简单的实现代码:```c//定义链表结构体typedef struct Node {int data;//数据元素struct Node* next;//指向后继节点的指针}Node, *LinkList;//创建链表LinkList createList() {LinkList head = NULL;//头指针初始化为空Node *p, *s;int x;scanf("%d", &x);//输入节点的数据元素while (x != 0) {s = (Node*)malloc(sizeof(Node));//分配节点内存s->data = x;//存储节点的数据元素if (head == NULL) {//链表为空时head = s;p = head;//当前节点为头节点}else {//链表不为空时p->next = s;//将新节点插入到链表尾部p = s;//当前节点成为尾节点}scanf("%d", &x);}p->next = NULL;//最后一个节点后继指针为空return head;}//删除链表中的节点void deleteNode(LinkList list) {Node* p = list;while (p->next != NULL) {//循环查找节点if (p->next->data == x) {//找到了需要删除的节点Node* q = p->next;p->next = q->next;//删除节点free(q);//释放内存return;}p = p->next;//指向下一个节点}}```以上是链表动态内存分配的简单实现,可以根据具体需求进行修改和扩展。

memory allocation policy 内存分配策略 -回复

memory allocation policy 内存分配策略 -回复

memory allocation policy 内存分配策略-回复内存分配策略是计算机系统中的重要组成部分,用于决定如何为程序运行时提供存储空间。

不同的内存分配策略可以对程序的性能、资源利用和系统稳定性产生巨大影响。

本文将介绍内存分配策略的基本概念、常见类型和实施方法,并论述各种策略的优缺点。

一、内存分配策略的基本概念内存分配策略是操作系统或编程语言决定如何管理和分配程序所需内存的方式。

它在程序运行时负责为程序分配、回收和管理内存空间。

内存分配策略的目标是优化程序的性能和资源利用,同时保证系统的稳定性。

二、常见的内存分配策略类型1. 静态内存分配策略:在程序编译阶段,内存空间的分配是在编译时确定的。

程序在执行过程中无法动态分配或释放内存空间。

这种策略的优点是简单、高效,并且不会造成内存碎片。

然而,缺点是无法适应复杂的程序运行时内存需求变化。

2. 动态内存分配策略:在程序运行时,根据实际需要来动态分配和回收内存空间。

这种策略允许程序根据实际情况灵活地利用内存资源,但也容易导致内存碎片。

常见的动态内存分配方法包括堆、栈、全局内存等。

三、常见的内存分配策略实施方法1. 首次适应算法(First Fit):根据内存空闲列表,从头开始查找第一个满足大小要求的空闲块进行分配。

这种方法简单直接,但容易导致内存碎片。

2. 最佳适应算法(Best Fit):根据内存空闲列表,从所有满足大小要求的空闲块中选择最小空闲块进行分配。

这种方法能够最小化碎片化,但会增加搜索时间。

3. 最坏适应算法(Worst Fit):根据内存空闲列表,从所有满足大小要求的空闲块中选择最大空闲块进行分配。

这种方法可以减少频繁的内存分配和释放操作,但可能导致大量碎片化。

4. 快速适应算法(Quick Fit):将内存空闲列表按大小进行分组,根据程序所需内存的大小选择相应的空闲块进行分配。

这种方法提高了搜索效率,但会增加内存空闲列表的维护开销。

存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法存储管理是操作系统中非常重要的一部分,它负责对计算机系统的内存进行有效的分配和回收。

动态分区分配及回收算法是其中的一种方法,本文将详细介绍该算法的原理和实现。

动态分区分配及回收算法是一种将内存空间划分为若干个动态分区的算法。

当新的作业请求空间时,系统会根据作业的大小来分配一个合适大小的分区,使得作业可以存储在其中。

当作业执行完毕后,该分区又可以被回收,用于存储新的作业。

动态分区分配及回收算法包括以下几个步骤:1.初始分配:当系统启动时,将整个内存空间划分为一个初始分区,该分区可以容纳整个作业。

这个分区是一个连续的内存块,其大小与初始内存大小相同。

2.漏洞表管理:系统会维护一个漏洞表,用于记录所有的可用分区的大小和位置。

当一个分区被占用时,会从漏洞表中删除该分区,并将剩余的空间标记为可用。

3.分区分配:当一个作业请求空间时,系统会根据作业的大小,在漏洞表中查找一个合适大小的分区。

通常有以下几种分配策略:- 首次适应(First Fit): 从漏洞表中找到第一个满足作业大小的分区。

这种策略简单快速,但可能会导致内存碎片的产生。

- 最佳适应(Best Fit): 从漏洞表中找到最小的满足作业大小的分区。

这种策略可以尽量减少内存碎片,但是分配速度相对较慢。

- 最差适应(Worst Fit): 从漏洞表中找到最大的满足作业大小的分区。

这种策略可以尽量减少内存碎片,但是分配速度相对较慢。

4.分区回收:当一个作业执行完毕后,系统会将该分区标记为可用,并更新漏洞表。

如果相邻的可用分区也是可合并的,系统会将它们合并成一个更大的分区。

总结来说,动态分区分配及回收算法是一种对计算机系统内存进行有效分配和回收的方法。

通过合理的分配策略和回收机制,可以充分利用内存资源,提高系统性能。

然而,如何处理内存碎片问题以及选择合适的分配策略是需要仔细考虑的问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态内存分配一、实验目的动态分区分配是根据进程的实际需要,动态地为之分配内存空间,而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。

在本实验中运用了四种分配算法,分别是1.首次适应算法,2.循环首次适应算法,3.最坏适应算法4.最佳适应算法。

二、实验要求及功能介绍1.实验要求1.在实现关于内存管理的内存首选适应算法和最佳适用算法。

2.实现关于内存管理的内存动态分区分配布局初始化。

3.实现关于内存管理的内存动态分区分配申请分配。

4.实现关于内存管理的内存回收等基本功能操作函数。

2.功能介绍(1)首次适应算法在首次适应算法中,是从已建立好的数组中顺序查找,直至找到第一个大小能满足要求的空闲分区为止,然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空间令开辟一块新的地址,大小为原来的大小减去作业大小,若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。

(2)循环首次适应算法该算法是由首次适应算法演变而成,在为进程分配内存空间时,不再是每次都从第一个空间开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业,为实现本算法,设置一个全局变量f,来控制循环查找,当f%N==0时,f=0;若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。

(3)最坏适应算法最坏适应分配算法是每次为作业分配内存时,扫描整个数组,总是把能满足条件的,又是最大的空闲分区分配给作业。

(4)最佳适应算法最坏适应分配算法是每次为作业分配内存时,扫描整个数组,总是把能满足条件的,又是最小的空闲分区分配给作业。

三、实验流程图四、实验主要代码typedef struct freeNode //空闲区链表结点{int address; //开始地址int size; //分区大小freeNode *next; //指向下一个分区}*freetable;typedef struct workNode //作业区链表结点{char proname[20]; //作业名int address; //开始地址int size; //作业大小struct workNode *next; //指向下一个作业}*worktable;void workdiaodu(freetable freehead,worktable workhead,freetable p,freetable q,char proname[20],int size) //进行作业内存的分配{worktable newwork = new workNode;strcpy(newwork->proname,proname); //作业名newwork->size = size; //作业大小newwork->address = p->address; //起始地址newwork->next = NULL;//情况3:当作业大小<分区大小时if(p->size > newwork->size){p->address = p->address + newwork->size; //作业大小作为此分区的起始地址p->size = p->size - newwork->size; //分区大小为原分区大小-作业大小}//情况2:当作业大小=分区大小时else if(p->size == newwork->size){q->next = p->next;delete p; //删除此分区}//以下把新作业加入到作业区链表中worktable r = workhead->next;worktable w = workhead;while(r != NULL && r->address < newwork->address) //在作业区中进行查找新作业的内存位置{w = r;r = r->next;}if(r == NULL) //在作业区链尾{w->next = newwork; //添加到链尾}else //添加到链中任意位置{newwork->next = r;w->next = newwork;}cout<<"\n\n\t\t\t\t分配成功"<<"\n";}/*首次适应算法的原理*/void FFRequestMemory(freetable freehead,worktable workhead,char proname[20],int size){if(freehead->next == NULL){cout<<"\n\n\t\t\t分配失败,当前已无空闲区"<<"\n";return;}freetable p = freehead->next;freetable q = freehead;while(p != NULL && p->size < size) //进行从低地址分区开始搜索符合作业大小的内存分区{q = p;p = p->next;}if(p == NULL){cout<<"\n\n\t\t\t分配失败,当前已无足够内存分配"<<"\n";return;}workdiaodu(freehead,workhead,p,q,proname,size);}void deletebackup(freetable &backuphead) //删除临时链表,释放内存{freetable p = backuphead->next;freetable q;while(p != NULL){q = p;p = p->next;delete q;}backuphead->next = NULL;}/*循环首次适应算法的原理:*/freetable currenthead; //定义一个全局变量指针,指向每次分配完分区的下一个分区地址void NFRequestMemory(freetable freehead,worktable workhead,char proname[20],int size){if(freehead->next == NULL) //空闲区为空{cout<<"\n\n\t\t\t分配失败,当前已无空闲区"<<"\n";return;}freetable p = freehead->next;if(p->next == NULL) //当空闲区链表中只有一个分区时{if(p->size < size) //分区容量小于作业大小{cout<<"\n\n\t\t\t分配失败,当前已无足够内存分配"<<"\n";return;}workdiaodu(freehead,workhead,p,freehead,proname,size);return;}//当有2个或2个以上分区时,应该会出现以下2种情况://情况1、上一次分配的分区刚好是空闲区链表中最后一个分区结点//情况2、上一次分配的分区刚好是空闲区链表中第一个分区结点至倒数第二个分区结点的任意一个p = currenthead;freetable q;q = freehead;while(q->next != currenthead ){q = q->next;}//从currenthead指向的下一个分区开始查找至链尾while(p != NULL && p->size < size ){q = p;p = p->next;}if(p == NULL && currenthead == freehead->next) //当currenthead指向第一个分区时,就不需要进行循环了{cout<<"\n\n\t\t\t分配失败,当前已无足够内存分配"<<"\n";return;}if(p != NULL) //在未循环之前查找到了符合作业大小的分区{workdiaodu(freehead,workhead,p,q,proname,size); //进行内存分配if(p->next == NULL) //如果是空闲区中最后一个分区{currenthead = freehead->next;}else{currenthead = p->next;}return;}//以下说明currenthead指向的不是第一个分区,因此需要进行循环查找操作p = freehead->next;q = freehead;while(p != currenthead && p->size < size) //从链首开始查找到currenthead{q = p;p = p->next;}if(p == currenthead) //查找失败,没有符合条件的分区{cout<<"\n\n\t\t\t分配失败,当前已无足够内存分配"<<"\n";return;}//查找成功了workdiaodu(freehead,workhead,p,q,proname,size);if(p->next == NULL){currenthead = freehead->next;return;}currenthead = p->next;}/*最佳适应算法的原理:*/void BFRequestMemory(freetable freehead,worktable workhead,freetable backuphead,char proname[20],int size){//无空闲区时if(freehead->next == NULL){cout<<"\n\n\t\t\t分配失败,当前已无空闲区"<<"\n";return;}freetable p = freehead->next;if(p->next == NULL) //当空闲区中只有一个分区时,无需对分区进行排序{if(p->size < size) //当当前的分区内存不足分配作业时{cout<<"\n\n\t\t\t分配失败,当前已无足够内存分配"<<"\n";return;}else //当这个分区的内存大小大于或等于作业大小时{workdiaodu(freehead,workhead,p,freehead,proname,size);return;}}//当空闲区中有2个或2个以上分区时,应根据各分区的容量大小,进行从小至大的排序else{freetable newfree = new freeNode;newfree->address = p->address; //起始地址newfree->size = p->size; //分区大小newfree->next = NULL;//开始建立按容量大小排序的临时链表backuphead->next = newfree;p = p->next;freetable current;freetable prevnode;while(p != NULL){newfree = new freeNode;newfree->address = p->address; //起始地址newfree->size = p->size; //分区大小newfree->next = NULL;current = backuphead->next;prevnode = backuphead;while(current != NULL && current->size < newfree->size) //当作业大小大于或等于分区时,向后移{prevnode = current;current = current->next;}if(current == NULL) //链尾时,则将此分区排在最后{prevnode->next = newfree;}else{newfree->next = current;prevnode->next = newfree;}p = p->next;}//按从小到大排序完成后,则进行查找最优分区current = backuphead->next;while(current != NULL && current->size < size) //从链表第一个分区进行查找,当分区大小小于作业大小时,向后移动{current = current->next;}if(current == NULL) //移动到链尾,说明分配失败,没有适合作业大小的分区{cout<<"\n\n\t\t\t分配失败,当前无足够内存"<<"\n";deletebackup(backuphead);return;}else //查找到符合作业大小的分区,则应根据该分区记录的起始地址,在空闲区链表中查找此分区的具体位置{p = freehead->next;freetable q = freehead;while(p != NULL && p->address != current->address){q = p;p = p->next;}workdiaodu(freehead,workhead,p,q,proname,size); //开始进行内存分配deletebackup(backuphead);}}}/*内存的回收原理:*/void ReturnMemory(freetable freehead,worktable workhead,char proname[20]) {//作业区为空时if(workhead->next == NULL){cout<<"\n\n\t\t\t回收内存失败,作业区为空"<<"\n";return;}worktable p = workhead->next;worktable q = workhead;while(p != NULL && strcmp(p->proname,proname) != 0) //从作业区中进行查找作业名{q = p;p = p->next;}if(p == NULL){cout<<"\n\n\t\t\t回收内存失败,作业区中无此作业名"<<"\n";return;}//以下是查找作业名成功后进行的操作freetable newfree = new freeNode;newfree->address = p->address; //作业的起始地址newfree->size = p->size; //作业的大小newfree->next = NULL;q->next = p->next;delete p; //从作业区中删除此作业//从空闲区中查找回收内存的起始地址freetable r = freehead->next;freetable w = freehead;while(r != NULL && r->address < newfree->address){w = r;r = r->next;}if(r == NULL) //查找在链尾{w->next = newfree;//判断能否进行合并if(w->address + w->size == newfree->address) //如果前一个分区的起始地址+分区大小=回收内存分区的起始地址,则进行分区合并{w->size = w->size + newfree->size;w->next = NULL;delete newfree;}}else //查找到空闲区的其他位置时{newfree->next = r; //将分区插入到空闲区中w->next = newfree;//进行判断能否进行内存合并if(w->address + w->size == newfree->address && newfree->address + newfree->size != r->address){w->size = w->size + newfree->size;w->next = r;delete newfree;}else if(w->address + w->size != newfree->address && newfree->address + newfree->size == r->address){newfree->size = newfree->size + r->size;newfree->next = r->next;delete r;}else if(w->address + w->size == newfree->address && newfree->address + newfree->size == r->address){w->size = w->size + newfree->size + r->size;w->next = r->next;delete newfree;delete r;}}cout<<"\n\n\t\t\t\t回收内存成功"<<"\n";}void deleteall(freetable freehead,worktable workhead) //释放空闲区链表、作业区链表的所有内存{freetable p = freehead->next;freetable q;while(p != NULL) //释放空闲区链表{q = p;p = p->next;delete q;}freehead->next = NULL;delete freehead; //删除空闲区链表的头结点worktable r = workhead->next;worktable w = workhead;while(r != NULL) //释放作业区链表{w = r;r =r->next;delete w;}workhead->next = NULL;delete workhead; //删除作业区链表的头结点}五、实验结果六、实验总结通过本次实验,我对内存分配有了更深的了解。

相关文档
最新文档