C++new delete 实现原理

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上查看代码片派生到我的代码片

include

include

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值