new和delete最终调用malloc和free,关于malloc和free实现原理参见这篇文章:
http://blog.csdn.net/passion_wu128/article/details/38964045
new
new操作针对数据类型的处理,分为两种情况:
1,简单数据类型(包括基本数据类型和不需要构造函数的类型)
代码实例:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
int* p = new int;
汇编码如下:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
int* p = new int;
00E54C44 push 4
00E54C46 call operator new (0E51384h)
00E54C4B add esp,4
分析:传入4byte的参数后调用operator new。其源码如下:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
_THROW_NCEE(_XSTD bad_alloc, );
}
return (p);
}
分析:调用malloc失败后会调用_callnewh。如果_callnewh返回0则抛出bac_alloc异常,返回非零则继续分配内存。
这个_callnewh是什么呢?它是一个new handler,通俗来讲就是new失败的时候调用的回调函数。可以通过_set_new_handler来设置。下面举个实例:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片