C++ C++;重载的新[]查询:它的参数大小是多少?
我像这样重载了运算符new[]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,但它打印的
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] ;