C++ new和delete运算符

一、前言

学习过C语言会知道,在C语言中,动态分配内存用malloc()函数,释放内存用free()函数。在C++中这2个函数还是可以使用的,但是C++新增了2个关键字:new和delete。new 用来动态分配内存,delete 用来释放内存。我们可以这样使用:

int* p = new int;
delete p;int* pArray= new int[20];
delete[] pArray;

new 操作符会根据后面的数据类型来推断所需空间的大小。由上可知,使用new分配的内存用delete释放,使用new[]分配的内存用delete[]释放,它们是一一对应的。
new申请空间时会多申请4个字节,用于存放对象的个数,在返回地址时则会向后偏移4个字节,在delete时则会查看内存上对象的个数,根据个数确定调用几次析构函数,这样才能完全清理所有对象占用的内存,因此对于内置类型若new[],使用delete释放,没有影响;但若是自定义类型,使用delete释放时只会调用一次析构函数,就会存在有对象没有被析构的情况。

new是在自由存储区上分配内存(可以在堆上,也可以在静态存储区上,取决于operator new实现细节,取决与它在哪里为对象分配空间),必须手动释放,否则只能等到程序运行结束由操作系统回收。为了避免内存泄漏,new 和 delete、new[] 和 delete[] 操作符应该成对出现,并且不要和C语言中 malloc()、free() 一起混用。
在C++中最好使用new和delete管理内存,比C语言的malloc和free多了可以自动调用构造函数和析构函数,这样在程序运行结束时可以释放内存。

二、new、delete和malloc、free的区别

1、new和delete

new在操作时,内存通过 operator new 函数被分配,而且会为被分配的内存调用一个或多个构造函数构建对象;new内置了sizeof、类型转换和类型安全检查功能,对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new 的语句也可以有多种形式。如:

int *p= new int[100](1);// 创建100 个动态对象的同时赋初值1 

delete时,会为将被释放的内存调用一个或多个析构函数,还会通过 operator delete 函数释放内存。

2、malloc和free

malloc的函数原型为

void *malloc(long NumBytes)

由原型可知,调用malloc时需要指定分配内存的字节数,成功分配的话就返回对应的指针,指向被分配的内存块起始位置;否则返回空指针。

free的函数原型为:

void free(void *p)

将之前用malloc分配的空间还给程序或者操作系统,即对malloc申请的内存空间进行释放。
free函数释放的是指针指向的内存(不是释放的指针本身,不会删除指针本身), 其中指针必须指向所释放内存空间的首地址。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。

3、本质区别

1)malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符
2)new可以自动分配内存空间,malloc需要指定申请空间的大小
3)对于用户自定义的对象而言,malloc/free无法满足动态管理对象的要求。因为malloc/free是库函数而不是运算符,不再编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

new/delete可以被重载,malloc/free不可以;
new/delete底层是基于malloc/free实现的;
malloc分配内存之后发现不够,可通过realloc函数对其进行扩充或缩小;

malloc申请内存时返回内存地址要检查判空,因为申请失败时返回NULL;new不用判断,在内存分配失败时会抛出异常bac_alloc,因此可在new时加上异常处理机制,如:

int* p = new(std::nothrow) int[10];

为什么还保留了malloc和free?C++程序经常要调用C函数,而C程序 只能用malloc/free管理动态内存。若使用free释放new创建的动态对象,对象会因无法执行析构函数而导致程序出错。若delete释放malloc申请的动态内存,可能不会出错,但程序的可读性差。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值