new和malloc以及delete和free的区别
来源:互联网 发布:怎么运行java文件 编辑:程序博客网 时间:2024/06/05 17:17
malloc
malloc是C语言中的一个函数,作用是动态开辟一块连续的内存(初始值为随机值)。
原型为:
void *malloc( size_t size );//size_t为无符号整型,size为开辟的字节数。使用时需要指定数据类型。
包含的头文件是stdlib.h或malloc.h.
内存分配位置:堆中动态分配的内存。
具体分配过程:由程序向操作系统申请,操作系统遍历空闲结点链表,将第一个大于申请空间的堆结点分配给程序,然后将空闲结点链表中此节点删掉。
成功分配:返回值为指向被分配内存的指针。
失败分配:返回值为空NULL。
返回类型:void* (未确定类型的指针)。
void*类型可以通过强制类型转换转换为任意其他类型(因为用户存储数据类型未知,由用户决定数据类型)。
内存块释放:free()函数 将内存还给程序或操作系统。
注意:malloc与free都属于c/c++标准库函数,在使用时应该配对 申请之后不释放就会有可能发生内存泄漏。
使用free时需要检查指针是否为空。
delete与free的不同之处在于,用delete释放内存之前会先调用析构函数。delete与free在使用完成后注意将指针置为NULL,否则会形成悬空指针(指针所指内存已被释放,仍指向该内存),造成错误。
new
new 是c++中的运算符。
在使用:new时不止分配内存,还会进行初始化,执行相应构造函数,初始化时需要指定数据类型。
内存分配位置:自由存储区为对象分配内存。
使用时:无需引入头文件,new是保留字。
new 和 delete 是配对使用的。
new 可以看做是malloc 加 构造函数的执行,就是new更高级一些。
问题:用一个3*4的二维数组的动态开辟和内存释放:
//动态开辟int **p = new int*[3];for (int i = 0; i < 3; ++i){ p[i] = new int[4];}//释放for (int i = 0; i < 3; ++i){ delete []p[i];}delete []p;//这样开辟是错误的int **p = new int[3][4];
当用new[]时,delete时,应为delete[].
new有四种用法,如下:
- 普通(默认)new:
int *p = new int(10);//10表示初始值/*if(p == NULL)//开辟失败不会返回NULL,所以这样做是错误的。{ return -1;}*///若开辟失败会抛出一个异常:throw bad_alloc("");try{ int *p = new int(10);}catch (const bad_alloc &err)//可以通过捕获异常来解决{}
2、不抛出异常的new:
形如:int *p = new (nothrow) int(10);
不抛出异常的new可以通过返回值是否为空来判断是否开辟成功。
3、在堆上开辟常量:
例如:
const int *p = new const int(4);const int *q = new const int[10];//这样做没有什么意义,因为不能给*p和*q赋值
4、定位new(placement new):
定位new不真正在堆上开辟空间,是在已经存在的内存上使用空间。
char buffer[1024] = {0};char *p = new (buffer) char[100];
利用定位new可以实现简单的内存池。
- new和malloc以及delete和free的区别
- malloc/free 和 new/delete的区别
- malloc/free和new/delete的区别
- malloc/free 和 new /delete 的区别
- malloc/free和new/delete的区别
- malloc/free和new/delete的区别
- malloc/free 和 new /delete 的区别
- new/delete和malloc/free的区别
- new/delete和malloc/free的区别
- malloc/free 和 new /delete 的区别
- new/delete和malloc/free的区别
- new/delete 和malloc/free 的区别
- new/delete和malloc/free的区别
- new/delete 和 malloc/free 的区别
- new delete和 free malloc 的区别
- malloc/free和new/delete的区别
- malloc/free 和 new /delete 的区别
- malloc/free 和 new /delete 的区别
- 指定JSON.toJSONString中实体类属性的输出顺序
- Android开发命名规范和编码规范
- 关于eclipse 中Spket 1.6.23 不提示Jquery的原因
- Settings
- Google Chrome 快捷键大全
- new和malloc以及delete和free的区别
- 1100pat
- java WebService调用方式
- 【noip2015】子串
- 机器学习备忘录(持续记录)
- Linux学习 [2] vi编辑器 gcc工具链 make和Makefile gdb调试工具
- #android#刚接触android编程遇到的几个问题
- 从酷铺商贸新零售计划入手,来分析海航怎么样
- 模板整理: 图论---tarjan缩点/桥/割点