P59:
Foo的大小--------------->int 4
long 4
string 4
所以Foo对象的大小是12字节
operator new(size_t size)------->size实际上就是元素的大小,也就是12
当一个class没有虚函数,所以Foo without virtual dtor的大小是12字节,对于new Foo[5],12×5=60,但是又多了一个计数的(表示下面有几个),大小为4字节,所以一共大小为64
当一个class有虚函数,那么里面就会多一根指针,所以Foo with virtual dtor的大小是16字节,对于new Foo[5],16×5=80,但是又多了一个计数的(表示下面有几个),大小为4字节,所以一共大小为84
因为多了一个计数的,所以编译器可以很快的知道调用5次构造函数和5次析构函数
调用的是::operator new,即全局的operator new,不会进入我们写的重载的operator new
同样的,前面也是有一个计数的,占4字节
这是placement new
Foo* pf = new(300,'c')Foo------------->300,'c'就是placement argument,因为第一个参数必须是size_t,所以实际上一共有三个参数
size_t + placement argument
对于第五个,传入的第一个参数不是size_t,所以会抛出异常
分配完内存之后,若调用构造函数发出异常,才会调用我们自己重载的operator delete;
①②③④调用的都是默认的构造函数,⑤调用的是有参数的构造函数,但是这个构造函数抛出了异常,才会调用我们自己重载的operator delete
Rep表示有多少人与我共享,计数器