|
|
51CTO旗下网站
|
|
移动端

1.14.2 malloc/free与 new/delete

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍malloc/free与 new/delete。

作者:猿媛之家来源:机械工业出版社|2017-12-06 18:25

1.14.2 malloc/free与 new/delete

【真题 200】有如下代码:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. void setmemory(char **p, int num)  
  4. {  
  5. *p = (char *)malloc(num);  
  6. }  
  7. int main()  
  8. {  
  9. char *str = NULL;  
  10. setmemory(&str, 100);  
  11. strcpy(str, "hello");  
  12. printf(str);  
  13. return 0;  

程序的输出结果是()。答案:hello。需要注意的是,虽然上述程序存在运行结果,但是程序在结束的时候没有释放掉申请的空间,是存

在风险的。

【真题 201】当使用 C语言中的 malloc、C++语言中的 new进行动态内存分配时,得到的存储区在答案:B。

内存中的( )。

A.静态区  B.堆(heap)  C.栈(stack)  D.堆栈

E.内核内存  F.不确定

通常,内存分配方式有以下三种:

1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量, static变量。

2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,当函数执行结束时,这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3)从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new申请指定大小的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员自己决定,使用非常灵活,但问题也昀多。

所以,本题的答案为 B。

【真题 202】使用 malloc系统调用分配的内存是在()上。

A.栈 B.BSS C.物理内存 D.堆答案:D。 malloc是 memory allocation的缩写,意思是动态内存分配,系统将可用的内存块连接为一个长长的列表,

这个列表通常被称为空闲链表,当调用 malloc函数时,它沿此链表寻找一个大到足以满足用户请求所需要的内存块,然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到链表上。

在 C语言中,与内存申请有关的函数主要有 alloc、calloc、malloc、realloc、sbrk(用于修改程序 BSS段的大小,在 Unix/Linux操作系统下,malloc底层实现就是通过系统调用 sbrk实现的)等,其中,函数 alloc是向栈申请内存,而函数 malloc分配的内存位于堆中。所以,选项 D正确。

【真题 203】以下有关 C语言的说法中,错误的是()。

A.内存泄露一般是指程序申请了一块内存,使用完后,没有及时将这块内存释放,从而导致程序占用大量内存

B.无法通过 malloc(size_t)函数调用申请超过该机器物理内存大小的内存块

C.可以通过内存释放函数 free(void*)直接将某块已经使用完的物理内存直接还给操作系统

D.可以通过内存分配函数 malloc(size_t)直接申请物理内存答案:B、C、D。 malloc申请的是虚拟内存,而不是物理内存。所以,可以申请超过物理内存大小的块,所以选项 B和 D错误。

free具体算法由 C函数库实现的,与操作系统无关,一般来讲 free函数只更新空闲块,不调用任何系统,也就是说 free释放的内存有可能不还给系统,只有进程退出时才会归还给操作系统,因此,选项 C也是错误的。

【真题 204】下面有关 malloc和 new的说法中,错误的是()。

A.new建立的是一个对象, malloc分配的是一块内存

B.new初始化对象,调用对象的构造函数,对应的 delete调用相应的析构函数, malloc仅仅分配内存,free仅仅回收内存

C.new和 malloc都可用于申请动态内存, new是一个操作符, malloc是一个函数

D.new和 malloc都是保留字,不需要头文件支持答案:D。对于选项 A、选项 B与选项 C,描述正确。对于选项 D,new是操作符、是保留字,不需要头文件支持,而 malloc是函数,需要头文件支持。

所以,选项 D错误。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

实时UML与Rational Rose RealTime建模案例剖析

本书将实时系统、实时统一建模语言、实时系统的统一开发过程和Rational Rose RealTime建模环境有机地结合起来,以案例为基础,系统地介绍了...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊