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

C和C++动态内存分配和释放的区别

2015-03-24 23:51 411 查看
5月6号去百度暑期实习招聘现场打了满满一瓶酱油,尽管进行了网申,但是没有收到百度的笔试通知,只好和几名同时没有收到通知的好友一同去复旦霸笔了,复旦五角场校区算是一个故地,因为之前腾讯实习招聘笔试也是在这里进行的,幸运的是腾讯出的考题都比较基础,有幸通过了笔试筛选进入了一轮面试,本人水平有限也就这能止步一轮面了,已经很高兴了,并不奢望收到腾讯或百度的橄榄枝,只是希望在参加这样的笔试面试的过程中不断查漏补缺,增加经验,不断提高自己,希望正式找工作的时候能够满足名企的要求。

言归正传,回到百度笔试题目上面,百度笔试题目明显和腾讯有着截然不同的风格,腾讯比较注重基础能力,而百度更注重解决实际问题的能力,只给出六道大题,基本上是与实际问题相结合的,很重视应试人对程序算法、数据结构的理解,这里不谈那些发散性的问题,这里只谈论基础问题,因为我觉得一切伟大的建筑都是基于牢固基石的,掌握好基础才能掌握更高深的技术。

其中一道很基础的问题是问C和C++在动态内存分配,释放方面的区别。作为一个励志成为C和C++软件开发人员,居然连这个问题都解答的含糊不清,深感惭愧,这才认真总结一番。

一、先来谈谈在C语言下,动态内存分配和释放的特点。

动态分配内存的定义是这样的,指在程序运行过程中,要申请内存,系统会根据程序的实际情况来分配,分配空间的大小是由程序的需求来决定的。在C语言下面,举个例子,定义一个指针,int *p;此时指针i是一个野指针,是一个指向不确定位置的指针,对它进行操作是很危险的,此时我们需要动态分配内存空间,让i指向它。而有一种形式是这样的,int *p=&b;这并非是一种动态内存分配方式,而是一种指针的初始化,把变量b的首地址给了指针p。在C语言下究竟如何实现动态内存分配的呢?这里提供了几个函数来实现,分别是malloc(),calloc(),realloc(),而释放内存的函数为free(),分别探讨他们的异同。

1.malloc函数

  函数原型为void *malloc(unsigned int size);在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“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大小的连续的空间,那么就返回*ptr,如果没有size大小的空间,那么就需要重新申请新的连续空间,把之前空间的数据拷贝到新的空间,释放以前的空间的数据,返回新的地址。

**动态申请的内存空间要进行手动用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;

参考资源来源:http://www.cnblogs.com/zhj202190/archive/2011/05/11/2043620.html

http://apps.hi.baidu.com/share/detail/57234849
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: