您的位置:首页 > 编程语言 > C语言/C++

C和C++怎样分配和释放内存,区别是什么 --百度实习笔试题(2012.5.6)

2014-06-01 16:47 363 查看
这个问题很基础,考察对语言的掌握深度。

之前看过Stanford University的一门公开课,叫做编程范式,主讲师是Jerry
Cain,对C/C++的一些语法以及内存管理进行了深入透彻的讲解,讲的实在是太好了,让人真是佩服的五体投地。后来我慢慢明白,那些真正的大师,不光在自己的研究领域做得出色,更能深入浅出地把自己的学问讲出来,真是让人敬佩。

好了,言归正传,接着说这个问题,对于c语言的内存分配与释放,主要是利用C语言提供的几个标准库函数。

下面的内容部分来自/article/5538098.html

一、C语言动态内存分配

1.malloc函数

  函数原型为void *malloc(unsigned int size);

在内存的动态存储区中分配一块长度为"size" 字节的连续区域。但是注意,这里说是分配size个字节,但实际上往往比这些字节还多一些,比如size=100,其实分配的可能会是104,那多出来的去哪了? 多出来的那一部分就位于这段分配的内存区域的开头部分,用来记录这段区域的大小等信息。这yang,当对这块内存区域调用free()的时候,编译器就可以根据开头部分对这块区域描述的大小进行精确的释放。

函数的返回值为该区域的首地址。

“类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。

“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。

2.calloc 函数

函数原型为void *calloc(unsigned int num, unsigned int size)

   按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为num*size。

函数返回该存储区的起始地址。

calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。

3. realloc函数:

  函数原型为void *realloc(void *ptr, unsigned int size)

重新定义所开辟内存空间的大小。其中ptr所指的内存空间是用前述函数已开辟的,size为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地址(该地址可能与以前的地址不同)。例如p1=(float *)realloc(p1,16);将原先开辟的8个字节调整为16个字节。

注意:**动态申请的内存空间要进行手动用free()函数释放

4. free函数:

  函数原型为void free(void *ptr)

  将以前开辟的某内存空间释放。函数原型为 void free(void *ptr)其中ptr为存放待释放空间起始地址的指针变量,函数无返回值。应注意:ptr所指向的空间必须是前述函数所开辟的。例如free((void *)p1);将上例开辟的16个字节释放。可简写为free(p1);由系统自动进行类型转换。

二、C++语言动态内存分配

  C++语言中用new和delete来动态申请和释放内存。

1. 申请单个对象

  int *p;

  p=new int;或者 p=new int(value);

  2. 动态申请数组

  int *p;

  p=new int [100];

  这样可以申请长度为100的数组,但是不能进行初始化。

 3. delete

  int *p, *q;

  p=new int;

  q=new int[10];

  delete p;

  delete [ ]q;
对于c++里面new,delete的实现,

new的过程(关于new的深入理解,可以参考这篇好文:/article/9470561.html)

当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。其实,new的第一步实现也是使用的c里面的mallloc()实现。

所以可以总结一下今天的问题:

C是malloc和free,C++是new和delete,区别如下:
(1)new、delete 是操作符,可以重载,只能在C++中使用。
(2)malloc、free是函数,可以覆盖,C、C++中都可以使用。
(3)new 可以调用对象的构造函数,对应的delete调用相应的析构函数。
(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数。
(5)new、delete返回的是某种数据类型指针,malloc、free返回的是void指针(可强制转型)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: