对operator new调用机制的理解

 

在effective中meyers提到了怎样定制一个类得自己的operator new 操作符函数:
代码类似如下:

[code=C/C++]void * Myclass ::operator new(size_t size)
{
new_handle  globalHandle=std::set_new_handle(currentHandle);

void *memory;
try
{
memory=::operator new(size);
}
catch(std::bad_alloc&)
{
std::set_new_handle(globalHandle);
throw;
}

std::set_new_handle(globalHandle);
return memory;
}[/code]

以前我的理解是, 在调用Myclass *pm=new Myclass 的时候,在new操作符内部先调用malloc函数配置内存大小,再调用 类Myclass的默认构造函数。那么我们在对类Mycalss定义自己的operaotr new 操作符的时候,就必须在为它分配等于sizeof(Mycalss)的内存空间之后,再调用它的默认构造函数。但是我在meyers的这个自定义的operator new 里面并没有看到这个对默认构造函数的调用。于是,我猜想在operator new 内部只是简单的调用malloc来返回一个void *指针,而这个对默认构造函数的调用是在对operator new 函数结束之后,由编译器自动进行的,而不是在operaotr new 内部进行的。          

 

结论:当调用语句:Myclass *pm=new Myclass的时候,如果我没有对calss Myclass 定制我自己的oprator new ,那么它就会先调用全局的operator new ,编译器再在这个基础上面调用它的默认构造函数。当我们的类自己定义了operator new 操作符的时候,它就先调用类自己的new,编译器再调用它的默认构造函数。而malloc与new的区别就在于:如果是malloc,那么它简单返回一个指向分配内存的空间的void *指针,如果是new,那么在返回void *指针之后,编译器还会调用相应的类的默认构造函数。其中最重要的是:对默认构造函数的调用不是operator new进行的,而是编译器进行的。

例如:Myclass *pm=new Myclass的时候,它等价于下面的伪c++代码:

void *pm=Myclass::operator::new(sizeof (Myclass));

Myclass::Myclass(pm);
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值