分享

c与c++分别是怎样动态分配和释放内存的,有什么区别?(转) demo大全

 职业酱油仔 2013-05-14

查了查资料,总结了以下几点: 

一、先来谈谈在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为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地址(该地址可能与以前的地址不同)。例如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;

 


1 new 是个操作符
malloc是个分配内存的函数,供你调用的.
2
new 建立的是一个对象,会调用构造函数。 malloc分配的是一块内存. 3 new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间 malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.

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

http://apps.hi.baidu.com/share/detail/57234849

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多