malloc,new 及free,delete的区别和联系

内存动态分配方法

1.内存分配方式(三种)
(1)静态存储区分配,内存在程序编译时就分配好,在程序整个运行时期都存在。例如全局变量,static变量
(2)栈上创建,函数局部变量都可以在栈上创建,函数执行结束时被自动释放。效率高,但分配内容有限。
(3)堆上分配,程序运行时用malloc或new申请内存,程序员负责在何时用free或delete释放内存。

2.内存使用错误
(1)内存分配未成功,却使用了它。
解决方法:在使用内存之前检查指针是否为NULL。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。
(2) 内存分配虽然成功,但是尚未初始化就引用它。
解决方法:创建数组,要赋初值,及时赋零值。
(3)内存分配成功并且已经初始化,但操作越过了内存的边界。
(4)忘记了释放内存,造成内存泄露。
(5)释放了内存却继续使用它。

总结:

【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存
【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作
【规则4】动态内存的申请与释放必须配对,防止内存泄漏。
【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”

一 . new

new和delete运算符用于动态分配和撤销内存的运算符

new的用法:

1.开辟单变量地址空间
1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new
int 即为将一个int类型的地址赋值给整型指针a.
2)int *a = new int(5) 作用同上,但是同时将整数赋值为5
2. 开辟数组空间
一维: int *a = new int[100];开辟一个大小为100的整型数组空间
一般用法: new 类型 [初值]

delete用法:
1. int *a = new int;
delete a; //释放单个int的空间
2.int *a = new int[5];
delete [] a; //释放int数组空间
要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.
用new和delete可以动态开辟,撤销地址空间.在编程序时,若用完一个变量(一般是暂时存储的数组),
下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它.

二 . malloc

   原型:extern void *malloc(unsigned int num_bytes);

  用法:#i nclude

malloc()函数的工作机制:

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc
函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大
小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并
将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到
最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以
满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们
进行整理,将相邻的小空闲块合并成较大的内存块。

1.malloc(realloc)/free
(1)malloc/free是(libc.soc语言的库函数)。
(2)free释放内存时,不区分单个元素内存和数组分配。
(3)malloc开辟内存失败,返回值和NULL进行判断。
2.new/delete
(1)new/delete属于运算符不属于函数。
(2)delete释放内存时,区分单个元素内存和数组分配。

malloc和new的区别

1.malloc是函数,而new是运算符。
2.malloc结果要进行类型强转,new不用。
3.malloc只能分配内存,new还可以初始化。
4.malloc开辟内存失败返回NULL指针,new发出bad——alloc异常。(try catch)
5.new底层调用的是malloc。

free和delete的区别

1.delete底层调用的是free。
2.delete释放数组内存时,delete和指针之间要加 [ ](用来区分单个元素内存和数组内存)。

拓展问题:以下两组的区别

int *P1=new int[3];//在堆上开辟空间,不初始化
int *P2=new int3;//除在堆上开辟空间之外,还初始化为一个整型数组,之中的元素分别为0;

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭