理解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释放空间.
posted @ 2010-09-24 22:31  秋天的风  阅读(504)  评论(0编辑  收藏  举报