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
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
相关文章推荐
- OpenCV(4)-图像掩码操作(卷积)--平滑处理
- springboot-基础入门
- MySQL数据库备份Shell脚本
- MySQL数据库备份Shell脚本
- l啦啦啦
- [android] 网络链接类型和渠道
- 如何在Django中使用mongodb数据库?
- iOS项目架构 小谈
- Problem G: B 结构体--统计投票
- 区块链的七年之痒
- nginx 使用实践
- php中三种数据库的连接方式
- Problem F: C++结构体之统计最高最低分
- 模拟集合的Iterator
- vim环境设置(应用于python编程)
- 使用Dockerfile构建镜像
- Problem C: 结构体---职工信息结构体
- XML--- XML文档类型定义(DTD)
- Problem A: 结构体--日期计算
- 反射