new operator、operator new 、placement new三者之间的区别与联系
来源:互联网 发布:河北师范大学网络教学 编辑:程序博客网 时间:2024/05/22 13:40
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 operator、operator new 、placement new三者之间的区别与联系
- new operator、operator new 、placement new三者之间的区别与联系
- new operator、operator new 、placement new三者之间的区别与联系
- C++中的new、operator new与placement new的区别
- operator new与new operator 的区别
- new 、operator new 和 placement new 区别
- new 、operator new 和 placement new 区别
- new 、operator new 和 placement new 区别
- c++operator new/new operator、operator delete/delete operator的区别与联系
- placement new operator new
- operator new()、placement new()与new关键字
- new 与 operator new,placement new
- C++ new/operator new/placement new的区别
- 【C++ placement new、new、operator new】的区别
- new; operator new; placement new
- new, operator new, placement new
- new、operator new、placement new
- new、operator new、placement new
- postgres 聚集函数编写 教程
- SQL Server 磁盘空间告急(磁盘扩容)
- 交换机的背板带宽,交换容量,包转发率区别
- 新浪微博地址url字符与mid的相互转换算法及原理
- struts2.0中struts.xml配置文件详解
- new operator、operator new 、placement new三者之间的区别与联系
- java 利用DOM写入XML文档
- CSS背景图拉伸自适应尺寸,全浏览器兼容
- Microsoft C++ exception: EEResourceException(orig. IS2120@BG57IV3)
- C语言中的free函数
- Examples of crontab expressions
- ubuntu 下打开windows 文件 程序代码 出现乱码,或者windows打开ubuntu下文件乱码
- 工具类 - 运算
- poj 2182