理解New/Delete和Malloc/Free操作符
来源:互联网 发布:java商城的功能 编辑:程序博客网 时间:2024/05/26 19:19
理解New/Delete和Malloc/Free操作符
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不抛出异常,会一直循环申请内存,直到成功。
重载运算符new
class Test
{
public:
void* operator new(size_t size)
{ ... }
};
operator new默认会去申请内存,成功了会返回内存地址,失败了会调用new_handler,然后再去申请内存,一直循环。所以operator new要返回,必须满足一下条件:
A. 在程序启动的时候预留一部分内存,在new_handler里释放这部分内存,使得operator new能成功分配到内存
B.抛出bad_alloc异常
C.直接退出程序(abort, exit)
D.设置新的new_handler处理函数,set_new_handler(0)取消当前处理函数,默认抛出bad_alloc异常
(3)placement new
用于定位构造函数,在指定的内存地址上用指定类型的构造函数构造对象。
例如:new(ptr) Test("hello");// ptr->Test::Test("hello");
我们可以利用malloc+placement new来构建自己的内存管理模块,创建对象时,通过malloc申请一个内存块,然后调用placement new来完成对象的初始化;释放对象时,首先调用对象的析构函数,然后通过free释放空间.
- 理解New/Delete和Malloc/Free操作符
- malloc/free和new/delete
- new/delete 和 malloc/free
- malloc free 和new delete
- malloc/free和new/delete
- malloc/free 和 new/delete
- malloc/free和new/delete
- new/delete和malloc/free
- malloc/free和new/delete
- new、delete和malloc、free
- malloc-free和new-delete
- new/delete和malloc/free
- malloc/free和new/delete
- malloc()、free()和new、delete
- new,delete和malloc,free
- malloc/free和new/delete
- malloc/free和new/delete
- malloc/free和new/delete
- Android源码目录结构详解 (2.1)
- unit5 循环结构 (for循环)
- 如何配置msvc命令行环境(续)——编写msvc编译脚本
- gauss-jordan 消元法
- Android System Architecture
- 理解New/Delete和Malloc/Free操作符
- 数据界面的交互设计
- mysql db query_mysql_query( )返回值
- case when 的使用,mysql
- 网页两侧浮动广告
- Approximating Translucency for a Fast, Cheap and Convincing Subsurface-Scattering Look
- zlib用法简单说明
- 关于三大框架(转)
- mysql中insert into select from的使用