2013-04-27 50 views
0

我用下面的代码重载了新的运算符。现在具有析构函数和新运算符的类

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

另请注意,你重载了'operator new'不正确。它应该在分配错误的情况下抛出'std :: bad_alloc',而不是返回0.它应该是'operator new []'数组。 – Lol4t0 2013-04-27 19:11:36

回答

1

您不应该担心这种行为,因为它是实现定义的。

在您的特定情况下,编译器存储有关数组大小的信息,以便在调用析构函数时可以知道存储了多少个元素。

在POD结构,即不具有任何非平凡析构函数,编译器不调用它,因此它不需要关于数组大小的信息的情况下。 8可能是sizeof(size_t),因为您可以将size_t元素存储在数组中。

再一次,它是所有的实现定义和只是猜测。