这篇文章介绍重载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