2013-04-27 4 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

ответ

1

Вы не должны беспокоиться об этом поведении, так как оно определяется реализацией.

В вашем конкретном случае компилятор хранит информацию о размере массива, поэтому он может знать, сколько элементов хранится при вызове деструкторов.

В случае структуры POD, у которой нет никакого нетривиального деструктора, компилятор не вызывает его, и поэтому ему не нужна информация о размере массива. 8, вероятно, sizeof(size_t), так как вы можете хранить size_t элементов в массиве.

Опять же, все это реализация определена и просто предположение.

Смежные вопросы