-5

Ques1. Может ли кто-нибудь сказать мне результат следующей программы и как ее работа?Перегрузка Opertor new?

#include <iostream> 
#include <malloc.h> 
#include <vector> 

using namespace std; 

class Base 
{ 
public: 
void* operator new(size_t size) 
{ 
    void *storage = malloc(size); 
    if(NULL == storage) { 
     throw "allocation fail : no free memory"; 
    } 
    cout << "size " << size << endl; 
    return storage; 
    cout << "delete\n"; 
} 
    void operator delete(void* p) 
    { 
     cout << "delete\n"; 
     free(p); 
    } 
private: 
    int m_data; 
}; 


class Derived : public Base 
{ 
private: 
    int m_derived_data; 
    vector<int> z, y, x, w; 
}; 


int main() 
{ 
    Base* b = new Base; 
    delete b; 

    Derived* d = new Derived; 
    delete d; 
    return 0; 
} 

Ques2. Если я напишу Base * bp = new Derived; Что будет в этом случае?

Ques3. Новый оператор вызывает конструктор автоматически, поэтому, перегружая новый оператор, как я могу вызвать конструктор?

Ques4. необходимо перегрузить новый и удалить оператор в обоих классах?

+0

Публикация кода, который фактически компилируется. – user657267

+0

Это даже не компилируемый код. –

+0

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что SO - это проблемы практического программирования. Вопросы интервью - это не практические проблемы программирования. – IInspectable

ответ

1

Хорошо, давайте дадим это попробовать:

Ques1. Может ли кто-нибудь сказать мне результат следующей программы и как ее работа?

Член operator new и operator delete будет использоваться при создании и уничтожении объектов класса Base (и его производных классов, если они не заявляют о своей собственной).

Было бы ожидать выход:

размер 4
удалить
размер 128 удалить

или что-то близкое к тому, что (размер 128 Derived догадка).

Ques2. Если я напишу Base * bp = new Derived; Что будет в этом случае?

Будет работать. Параметр sizeoperator new получит правильный размер для Derived.

Но, как обычно, вы получите в беду позже, если вы попытаетесь удалить Derived через указатель на Base, когда Base не имеет виртуальный деструктор.

Ques3. Новый оператор вызывает конструктор автоматически, поэтому, перегружая новый оператор, как я могу вызвать конструктор?

Это новое выражение new Derived, которое вызывает конструктор. Это не то же самое, что и operator new, даже если имена очень похожи.

Компилятор добавит код для вызова соответствующего конструктора, вам не обязательно это делать.

Ques4. Нужно ли перегружать новый оператор delete в обоих классах?

operator new(size_t size) получит необходимый размер памяти для распределения.