C++ C++;重载的新[]查询:它的参数大小是多少?

C++ C++;重载的新[]查询:它的参数大小是多少?,c++,overloading,new-operator,C++,Overloading,New Operator,我像这样重载了运算符new[] void * human::operator new[] (unsigned long int count){ cout << " calling new for array with size = " << count << endl ; void * temp = malloc(count) ; return temp ; } 假设sizeof(human)=16,但它打印的

我像这样重载了运算符new[]

void * human::operator new[] (unsigned long int count){
      cout << " calling new for array with size  = " << count <<  endl  ;
      void * temp = malloc(count) ;  
      return temp ; 
}
假设
sizeof(human)=16
,但它打印的计数是232,即14*16+sizeof(int*)=224+8

为什么要分配这个额外的空间?它在哪里被人们记住?
因为当我打印
*h
h[0]
时,我得到了相同的结果,所以它不在内存块的开头。它到底是正确的还是我遗漏了一些东西?

分配的额外空间用于存储数组的大小以供内部使用(实际上,
delete[]
知道要删除多少)


它存储在内存范围的开头,紧靠
&h
之前。要查看这一点,只需查看
操作符new[]
中的
temp
值。该值将不同于
&h

中的值,它用于存储分配的对象数量,以便在调用
delete[]
时删除适当数量的对象。有关更多详细信息,请参见此。

问得好。然而,我内心的挑剔者需要指出,你不需要检查malloc()是否返回空指针。@sharptooth:没错,但这是故意的,因为我想专注于真正的问题,而不是添加太多的if:)理想情况下,需要检查temp=0否则会引发一些异常(bad_alloc kinda)。额外的字节用于存储分配的字节数。但它存储的位置取决于实现。这显然是对运算符重载的滥用
foo[i]
的意思应该是“在foo中查找元素编号i”,而不是“分配i字节内存”。@fredfoverflow:为什么这是一种滥用?否则,您将如何在堆上创建对象数组?
human * h = new human[14] ;