如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。你是怎么处理内存耗尽

题目
问答题
如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。你是怎么处理内存耗尽的?
参考答案和解析
正确答案: (1)判断指针是否为NULL,如果是则马上用return语句终止本函数。
(2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。
(3)为new和malloc设置异常处理函数。例如VisualC++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,也可以让malloc享用与new相同的异常处理函数。我一般是直接return了。
解析: 暂无解析
如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

C++用操作符new和delete来进行动态内存管理(分配与释放堆内存)。()


参考答案:正确

第2题:

c++提供的动态内存分配和释放的操作符为【 】和【 】。


正确答案:newdelete
new,delete

第3题:

已知“int *p=malloc(100);”,要释放p所指向的动态内存,正确的语句为()。

a. free(p);

b. free p;

c. free(*p);

d. free[p];


正确答案是:C

第4题:

已知“int *p=malloc(100);”,要释放p所指向的动态内存,正确的语句为()。

Afree(p);

Bfree p;

Cfree(*p);

Dfree[p];


A

第5题:

PowerVM是否支持动态内存调整?()

A.是

B.否


参考答案:A

第6题:

C++中,对象保存在内存中,栈内存是自动分配和释放的,而堆内存需要用户自己申请和释放。()


参考答案:错误

第7题:

某操作系统的内存管理采用段式管理,内存分配采用最佳适配算法,计算机的内存为50M,刚开始时内存均未使用。经过一段时间的运行(其内存申请;释放的序列为:申请20M一申请15M一申请10M一释放15M一申请10M一释放20M一申请4M)以后,内存中存在(26)。

A.2个空闲块,长度分别为10M、16M

B.3个空闲块,长度分别为20M、1M、5M

C.1个空闲块,长度为26M

D.4个空闲块,长度分别为5M、5M、5M、11M


正确答案:B
解析:段式管理中内存分配需要对一个合适的空闲块进行切割并分配。经过多次的分配与释放内存操作以后,内存可能变得支离破碎,由于反复切割,出现大量互不邻接的空闲块,每个空闲块长度不大,基本不能满足用户的正常需要。然而,所有空块加在一起,又是一个相当大的数目,造成内存不能充分利用。由于碎片在段以外,又称“外碎片”。为了缓解这种现象,分配内存时如何选取空闲块加以切割成了研究的问题,最主要的有两种方法:最先适配和最佳适配。所谓最先适配是选取空闲块链表中第一个不小于申请要求的空闲块,加以切割与分配,这种方法的运行效率较高,平均检索时间为1/2空闲块链表长,但有可能将本来可以满足较大空间要求的大空闲块分割,不利于较大空间要求的有效满足;为避免不能“物尽其用”的现象出现,最佳适配法检索全部空闲块,挑选最接近且不小于申请要求的空闲块加以分割和分配,从而避免“大材小用”现象,但算法的效率较差,每次分配都需要调查所有空闲快的长度,平均检索时间较最先适配法长了一倍。需要说明的是:这两种算法在解决碎片问题方面不能简单地加以比较,最先适配法虽然会出现大材小用的现象,但即使是大材小用,裁下来的空闲块可能还比较大,还能满足其它较小的要求;后者虽然一定程度避免了大材小用现象,但裁下来的部分可能都比较小,可能再也不能满足任何申请要求,成了碎片。本题中,由于内存没有使用,只有一个空闲块,起始地址为0,长度为50M。响应第1个要求(申请分配20M)后,分配出去的是起始地址为0、长度为20M的内存块;空闲块还是—个,长度为30M,起始地址为20M。同理,响应第2个要求(申请分配15M)后,分配出去的是起始地址为20M、长度为15M的内存块:空闲块还是一个,长度为15M,起始地址为35M。响应第3个要求(申请分配10M)后,分配出去的是起始地址为35M、长度为10M的内存块;空闲块仍旧是一个,长度为5M,起始地址为45M。第4个要求是释放15M内存,显然是第2个要求所申请的。这时,空闲块链表有了两项:第5个要求是申请10M,只有第1个空块可以满足,切割并分配的磁盘块的起始地址20M,长度10M,空闲块链表变成:第6个请求释放20M,是第1次申请的内存,响应释放后空闲块链表有了3个空闲块:第6个请求是申请4M内存,这时3个空闲块都能满足,但后两个的大小与申请数量最接近,可以任意选择,这里选第2个加以切割分配空闲块链表变成:所以正确答案应该为B。

第8题:

关于动态存储分配,下列说法正确的是

A.new 和 delete是C++语言中专门用于动态内存分配和释放的函数

B.动态分配的内存空间也可以被初始化

C.当系统内存不够时,会自动回收不再使用的内存单元,因些程序中不必用delete释放内存空间

D.当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用new


正确答案:B
解析:本题考核动态存储分配。用于动态分配的内存空间称为堆内存,它通常由操作系统进行管理且数量有限,其内存空间可以被初始化。若程序不断分配堆内存,则可能耗尽,在这种情况下,系统无法再对new提出的内存分配请求给予满足,此时 new会返回空指针NULL,表示动态存储分配操作失败,不会造成系统崩溃。在C++程序中由new分配的动态内存空间必须通过delete运算符释放。

第9题:

某操作系统的内存管理采用段式管理,内存分配采用最先适配算法,计算机的内存为50MB,刚开始时内存均未使用。经过一段时间的运行(其内存申请、释放的序列为:申请20MB—申请15MB—申请10MB—释放15MB—申请10MB—释放20MB—申请8MB)以后,内存中存在(23)。

A.2个空闲块,长度分别为10MB、12MB

B.3个空闲块,长度分别为12MB,5MB,5MB

C.1个空闲块,长度为22MB

D.4个空闲块,长度分别为5MB、5MB、5MB、7MB


正确答案:B
解析:本题考查的是段式管理中,空闲块的管理策略、内存分配的最先适配算法及其应用。在段式管理的操作系统中,由本题考查的是段式管理中,空闲块的管理策略、内存分配的最先适配算法及其应用。在段式管理的操作系统中,由于每一个段的内存区域是连续的,经过一段时间的内存分配与释放后,在内存将会形成若干彼此并不相邻的空闲存储块。通常,采用空闲块链表的方式来管理,每个链表项包括该空闲块的起始地址和长度。当一个内存申请到来之际,操作系统将检查空闲块链表,选择合适的空闲块,将其切割,分配给申请进程所需要的内存空间。由于空闲块的大小往往并不与所申请的数量恰好相等,会余下部分内存,形成新的空闲块,再将其链入空闲块链表。当进程释放一个内存块时,操作系统将检查它是否与现有的空闲块相邻,若相邻就加以合并,链入空闲块表,否则就直接链入。所谓最先适配算法,就是当一个内存申请到来时,操作系统检查空闲块链表,将所发现的第一个长度不小于申请要求的空闲块加以切割并分配。本题中,由于内存没有使用,只有一个空闲块,起始地址为0,长度为50M。响应第1个要求(申请分配20M)后,分配出去的是起始地址为0、长度为20M的内存块,空闲块还是一个,长度为30M,起始地址为20M。同理,响应第2个要求(申请分配15M)后,分配出去的是起始地址为20M、长度为15M的内存块,空闲块还是一个,长度为15M,起始地址为35M。响应第3个要求(申请分配10M)后,分配出去的是起始地址为35M、长度为10M的内存块,空闲块仍旧是一个,长度为5M,起始地址为45M。第4个要求是释放15M内存,显然是第2个要求所申请的。这时,空闲块链表有了两项:第5个要求是申请10M,显然第1个空块可以满足,切割并分配的磁盘块的起始地址为20M,长度为10M,空闲块链表变成第5个请求释放20M,是第1次申请的内存,响应释放后空闲块链表变成第6个请求申请8M,空闲块链表的第1项可以满足,切割并将起始地址为0,长度为8M的内存块分配出去,空闲块链表变成所以正确答案应该为B。

第10题:

如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。你是怎么处理内存耗尽的?


正确答案: (1)判断指针是否为NULL,如果是则马上用return语句终止本函数。
(2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。
(3)为new和malloc设置异常处理函数。例如VisualC++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,也可以让malloc享用与new相同的异常处理函数。我一般是直接return了。

更多相关问题