c++ new操作符

这篇文章介绍重载new操作的还蛮详细http://book.51cto.com/art/201202/317799.htm,但是其中有几个地方错了,纠正下,顺便补充点。

首先是类的operator new可以是static的,也可以是成员函数,这点很奇怪,但是事实。 虽然说如果new是成员函数,那么怎么传this指针,这的确是个很奇怪的地方。


new操作后是否调用类的构造函数,是要看new操作返回的指针是否为空。如果不为空,则为调用类的构造函数;否则不调用构造函数。编译器为new,生成的代码大致如下(我也是猜的):

class* p = new_op();//默认的new,或者自己重载的new

if (p)

{

p->virtual_table = virtual_a;//取决于具体的子类

p->p();//构造函数

}


可以用下面的代码来验证:

A.*pp 定义了自己的类new

B.*pp 没有定义类new


test.cpp:


int main()

{

A ach;

B bch;

printf("start.....\n");


A* a =new (NULL) A();

B* b =new (NULL) B();

return 0;

}

输出:

a constructor
b contructor
start........
a new operator
global new


test.cpp:

int main()

{

A ach;

B bch;

printf("start.....\n");


A* a =new (&ach) A();

B* b =new (&bch) B();

return 0;

}

输出:

a constructor
b contructor
start........
a new operator
a constructor
global new
b contructor


编译的时候要include <new>,并且要带编译选项-DEH_DELETE_HAS_THROW_SPEC


 g++ test.cpp A.cpp B.cpp def.cpp -DEH_DELETE_HAS_THROW_SPEC


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值