new operator、operator new 、placement new三者之间的区别与联系

new operator、operator new 、placement new三者之间的区别与联系


1. new的执行过程:

1)通过operator new申请内存

2)使用placement new调用构造函数(简单类型忽略此步)

3)返回内存指针

 

2. newmalloc的比较:

1new失败时会调用new_handler处理函数,malloc不会,失败时返回NULL

2new能通过placement new自动调用对象的构造函数,malloc不会

3new出来的东西是带类型的,mallocvoid*,需要强制转换

4newC++运算符,mallocC标准库函数

 

3. delete的执行过程:

1)调用析构函数(简单类型忽略此步)

2)释放内存

 

4.deletefree的比较

1delete能自动调用对象的析构函数,malloc不会

2deleteC++运算符,freeC标准库函数

 

5. new的三种形态:new operator,operator new, placement new

1new operator

上面所说的new就是new operator,共有三个步骤组成(申请内存,调用构造函数,返回内存指针),对于申请内存步骤是通过运算符new(operator new)完成的,对于调用什么构造函数,可以由placement new决定。

2operator new

像普通运算符一样可以被重载,operator new会去申请内存,申请失败的时候会调用new_handler处理,这是一个循环的过程,如果new_handler不抛出异常,会一直循环申请内存,直到成功。

重载operator new(注意:正像new delete 一一对应一样,operatornewoperatordelete 也是一一对应的;如果重载了operatornew,那么也得重载对应的operatordelete)

(3)placement new

placement new 是标准C++库的一部分,被声明在了头文件<new>中,所以只有包含了这个文件,我们才能使用它。它在<new> 文件中的函数定义很简单,如下所示:

#ifndef__PLACEMENT_NEW_INLINE

#define__PLACEMENT_NEW_INLINE

inline void *__CRTDECLoperator new(size_t, void *_Where) _THROW0()

{ // construct array withplacement at _Where

return (_Where);

}

inline void __CRTDECLoperator delete(void *, void *) _THROW0()

{ // delete if placementnew fails

}

inline void __CRTDECL operatordelete(void *) _THROW0()

{ // delete if placementnew fails

}

#endif /*__PLACEMENT_NEW_INLINE */

这就是placement new需要完成的事。细心的你可能会发现,placement new的定义与operator new声明之间的区别:placement new的定义多一个void*参数。

当然,如果显式地调用placement new,那么也得本着负责任的态度显式地调用与之对应的placement delete :p->~A();

最后总结一下:

1. 如果是在堆上建立对象,那么应该使用 new operator,它会为你提供最为周全的服务。

2. 如果仅仅是分配内存,那么应该调用operator new,但初始化不在它的工作职责之内。如果你对默认的内存分配过程不满意,想单独定制,重载operator new 是不二选择。

3. 如果想在一块已经获得的内存里建立一个对象,那就应该用placement new。但是通

常情况下不建议使用,除非是在某些对时间要求非常高的应用中,因为相对于其他两

个步骤,选择合适的构造函数完成对象初始化是一个时间相对较长的过程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值