以前我的理解是, 在调用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进行的,而是编译器进行的。