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有四种用法,如下:

  1. 普通(默认)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可以实现简单的内存池。

原创粉丝点击