您的位置:首页 > 运维架构

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

2017-08-29 09:13 369 查看
new operator、operator new 、placement new三者之间的区别与联系

1. new的执行过程:
(1)通过operator new申请内存
(2)使用placement new调用构造函数(简单类型忽略此步)
(3)返回内存指针
 
2. new和malloc的比较:
(1)new失败时会调用new_handler处理函数,malloc不会,失败时返回NULL
(2)new能通过placement new自动调用对象的构造函数,malloc不会
(3)new出来的东西是带类型的,malloc是void*,需要强制转换
(4)new是C++运算符,malloc是C标准库函数
 
3. delete的执行过程:
(1)调用析构函数(简单类型忽略此步)
(2)释放内存
 
4.delete和free的比较
(1)delete能自动调用对象的析构函数,malloc不会
(2)delete是C++运算符,free是C标准库函数
 
5. new的三种形态:new operator,operator new, placement new
(1)new operator
上面所说的new就是new operator,共有三个步骤组成(申请内存,调用构造函数,返回内存指针),对于申请内存步骤是通过运算符new(operator new)完成的,对于调用什么构造函数,可以由placement new决定。
(2)operator new
像普通运算符一样可以被重载,operator new会去申请内存,申请失败的时候会调用new_handler处理,这是一个循环的过程,如果new_handler不抛出异常,会一直循环申请内存,直到成功。
重载operator new(注意:正像new 与delete 一一对应一样,operatornew和operatordelete 也是一一对应的;如果重载了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。但是通
常情况下不建议使用,除非是在某些对时间要求非常高的应用中,因为相对于其他两
个步骤,选择合适的构造函数完成对象初始化是一个时间相对较长的过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  new operatoroperator
相关文章推荐