我用以下代码重载了new运算符。
void* operator new(size_t size)
{
cout<<"size=>"<<size<<endl;
return malloc(size);
}
现在,我尝试使用这个重载的new
为类对象分配内存。
假设类主体定义为:
class c
{
char ch;
};
我写了以下陈述
c * p=new c; // gives me the output size=>1 OK Fine..
c *p=new c[100]; // gives me the output size => 100 OK fine.
但现在我在课堂上添加了一个析构函数。 所以新的身体变成了:
class c
{
char ch;
public:
~c(){}
};
现在我再次写了相同的陈述
c *p= new c;// gives me the output size=>1 OK Fine..
c *p=new c[100]; // gives me the output size => 108.
这个额外的8来自哪里?
我尝试使用相同的语句再次分配数组,并且我的大小再次为108.(我有一个64位操作系统,所以我想每次都会分配一个额外的指针。)
当我们在类中有析构函数时,为什么我的编译器会分配这个额外的指针或者其他的指针?
答案 0 :(得分:1)
您不应该担心这种行为,因为它是实现定义的。
在您的特定情况下,编译器存储有关数组大小的信息,因此在调用析构函数时它可以知道存储了多少元素。
在POD结构的情况下,没有任何重要的析构函数,编译器不会调用它,因此它不需要有关数组大小的信息。 8可能是sizeof(size_t)
,因为您可以将size_t
元素存储在数组中。
同样,所有这些都是实现定义的,只是推测。