malloc/free与new/delete

2 篇文章 0 订阅

以上是malloc/free和new/delete的区别,带着这些区别,我们深入地了解动态内存管理的世界!

先说C语言里面的malloc/free
1. 使用malloc和free需要包含stdlib.h,这表明malloc和free是标准库函数;
2. malloc的返回类型是void*,,需要进行强制转型
3. malloc若失败了,返回的是NULL,所以才有了要在malloc之后判断其返回值是否为NULL的建议;
4. malloc仅仅实现了内存分配与释放;

再说说C++语言里面的new/delete
1. new和delete是运算符,就跟+-*/一样
2. new创建的东西是具有类型的,不像malloc返回一个void*
3. new若是失败了,会调用new_handler函数,而不是像malloc一样返回一个NULL,所以new的后面,别判断是否为NULL了
4. new不仅能动态分配内存,还能完成初始化工作,这是因为,new可以自动调用对象的构造函,这是malloc欠缺的。从功能上来讲,这应该算是new和malloc最大的不同了吧!

还是先说malloc和free

malloc的参数被声明为size_t,需要了解一下你的size_t是什么,我电脑上安装的是Visual Studio 2015, 我的size_t是unsigned int.
typedef unsigned int size_t;
如果你往malloc传的参数是long类型的,malloc收到的可能就是垃圾了!相反亦是这个道理。
2016年英特尔校招笔试题有一道题是用C语言实现字节对齐版本的malloc和free,大家可以百度一下如何实现!
其实C++里已经帮你实现好了,在corecrt_malloc.h里面,函数原型是这样的:
void* __cdecl _aligned_malloc(size_t _Size, size_t _Alignment);
void __cdecl _aligned_free(void* _Block);
关于malloc/free的常见问题:
Q:free后为啥要置为NULL?
当你调用free的时候,传入的指针指向的内存被释放,但调用函数的指针值可能保持不变,这是因为C的按值传参意味着被调函数永远不会改变参数的值。建议释放之后立即置为NULL!
Q:一定要手动释放吗?
不是一定的!一个真正的操作系统会在程序退出时回收所有的内存和资源。
Q:既然sizeof无法获知动态申请内存的大小,那么free又是如何知道有多少字节需要释放?
malloc和free的实现会在分配的时候记下每一块的大小。这个大小就记录在分配的内存块旁边!

再说说new/delete

operator new 和 operator delete函数有两个重载版本:
void * operator new(size_t);
void operator delete(void *);

void * operator new [] (size_t);
void operator delete [] (void *);
这是为了知道数组里对象的数目,以便一一调用它们的析构函数!
值得注意的是,对于内置数据类型的数组,它们没有构造函数和析构函数,释放内存时用delete 和 delete[]是一样的。

new的三种形态:

我们了解的new通常是new的第一种形态,即new是一个内存管理的operator. 使用它时,会发生下面这些事:
1. 从堆中划分出一块内存区域(Allocate raw memory for this object)
2. 自动调用构造函数,动态创建某种特定类型的数据(Call constructor to init that memory)。对于内置类型,没有第二步。
3. 返回该区域的指针(Return the pointer of this memory)
该数据使用完毕后,应该调用delete运算符,释放动态申请的这块内存。

程序中申请动态内存的时候用new,这是第一种形态,叫new operator.
第1步是第二种形态,叫operator new.
第2步是第三种形态,叫placement new.

new内存失败

与malloc动态申请内存失败时的test-for-NULL不同,当在上述的第1步通过operator new分配内存失败的情况下,抛出一个bad_alloc exception

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值