您的位置:首页 > 其它

malloc与new运算符的区别

2016-06-25 12:23 267 查看
1.数组与malloc的区别

malloc、calloc与realloc都是C/C++的标准库函数之一,用来动态在堆上分配内存。

一般来说由C/C++编译的程序在运行的时候都会在内存中占用一些空间,他们分为以下5个部分。

1)二进制代码区 就是放二进制代码的地方

2)栈 一些局部变量、临时变量和函数形参,由编译器分配内存

3)堆 动态内存区,程序员可以控制分配和释放的区域

4)常量区 存放文字字符串和常量

5)静态存储区 存放静态和全局变量

由以上可知数组与malloc的第一个区别,malloc从堆中分配内存,而普通数组则是在栈中。

堆是系统内存中的可用区域,和数据结构中的堆(Heap)意义并不相同,基本可以看成是空闲内存组成的大链表。通常来说,int a[100]在栈中占据的内存一般是连续的,而int *p = (int *)calloc(100, sizeof(int))在堆中所占据的内存却未必连续,内存之间可能是断开的,操作系统利用链表的形式来管理这些内存块。

其实定义int a[100],a会隐式转化为int * const p,所以无论是malloc分配的内存还是数组分配的内存,访问数据的形式都是一样的,既可以利用下标(a[1]),也可以利用指针(*(a+2))。

第二个区别是,使用过malloc之后,程序员需要通过free函数释放掉内存。

2.new、delete与malloc、free之间的区别

1)使用上的区别

int *p = (int *)malloc(100*sizeof(int));

free(p);

int *p = new int[100]();

delete [] p;

2)所能完成的功能不一样

malloc与free都是C/C++标准库函数,而new和delete都是C++操作符,malloc与free的使用需要头文件声明(#include <stdlib.h>),new、delete则不需要,new与malloc实现的功能相同,但是new更精炼。new在分配内存(创建对象)的同时,会调用构造函数,delete在释放内存(对象消亡)前,则会调用析构函数,malloc和free是库函数而非运算符,不在编译器的控制权限之内,因此不能把执行构造函数和析构函数的任务强加于malloc和free之上。

转自:http://blog.csdn.net/wusecaiyun/article/details/38949487
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: