new和delete解析 c++笔记

1.new/delete 和operator new/operator delete和malloc/free的关系 
new,delete运算符:
当我们使用一条new表达式时,实际上执行了三步操作:
第一步,new表达式调用一个名为operator new(或者operator new[])的标准库函数,该函数分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象(或对象数组);
第二部,编译器运行相应的构造函数以构造这些对象,并为其传入初始值;
第三部,返回一个指向该对象的指针。


当我们使用一条delete表达式时,实际执行了两部操作:
第一步对指针所指的对象或数组中的元素执行对应的析构函数;
第二部,编译器调用名为operator delete(或者 operatordelete[])的标准库函数释放内存空间。


我们不能改变new/delete的行为,但是通过重载operator new() 和 operator delete()可以实现自己想要的内存管理方式。
关于operator new有几点要注意:
(1)当无法满足所要求分配的空间时,则
        ->如果有new_handler,则调用new_handler,否则
        ->如果没要求不抛出异常(以nothrow参数表达),则执行bad_alloc异常,否则
        ->返回0
(2)重载时,返回类型必须声明为void*
(3)重载时,第一个参数类型必须为表达要求分配空间的大小(字节),类型为size_t
(4)重载时,可以带除(3)以外的其它参数 

他们之间的调用关系


2.new[]时底层处理的机制 


3.new/delete和malloc/free的区别 

1.操作对象有所不同
    malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用malloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。

2.用法上也有所不同。
函数malloc 的原型如下: 
void * malloc(size_t size); 
 malloc 申请一块长度为size 个字节 
 malloc 返回值的类型是void ,所以在调用malloc 时要显式地进行类型转换,将void 转换成所需要的指针类型。 
 malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。 

函数free 的原型如下: 
void free( void *memblock );
 如果p 是NULL 指针,那么free对p 无论操作多少次都不会出问题。 
 如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。

运算符new 使用起来要比函数malloc 简单得多,例如: 
int p1 = (int )malloc(size); 
int *p2 = new int[size]; 
 new 内置了sizeof、类型转换和类型安全检查功能。 
 对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。 
 如果对象有多个构造函数,那么new 的语句也可以有多种形式。


如果用new 创建对象数组,那么只能使用对象的无参数构造函数。例如
Obj *objects = new Obj[100];       // 创建100 个动态对象
不能写成
Obj *objects = new Obj[100](1);        // 创建100 个动态对象的同时赋初值1


在用delete 释放对象数组时,留意不要丢了符号‘[]’。例如 
delete []objects; // 正确的用法
delete objects; // 错误的用法
后者相当于delete objects[0],漏掉了另外99 个对象。
       
1、new自动计算需要分配的空间,而malloc需要手工计算字节数
2、new是类型安全的,而malloc不是,比如:
                 int* p = new float[2]; // 编译时指出错误
                 int* p = malloc(2*sizeof(float)); // 编译时无法指出错误
          new operator 由两步构成,分别是 operator new 和 construct
3、operator new对应于malloc,但operator new可以重载,可以自定义内存分配策略,甚至不做内存分配,甚至分配到非内存设备上。而malloc无能为力
4、new将调用constructor,而malloc不能;delete将调用destructor,而free不能。
5、malloc/free要库文件支持,new/delete则不要。
18051109457
2本质区别:
malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。
对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值