-5

問題1。任何人都可以告訴我以下程序的輸出以及它的工作原理嗎?重載Opertor新?

#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;在這種情況下會發生什麼?

問題3。新運算符自動調用構造函數,所以在重載新運算符的時候,我可以如何調用構造函數?

Ques4。是否有必要重載這兩個類中的新操作符和刪除操作符?

+0

首先發布實際編譯的代碼。 – user657267

+0

這甚至不是可編譯的代碼。 –

+0

我投票結束這個問題作爲題外話,因爲這是關於實際編程問題。面試問題不是實際的編程問題。 – IInspectable

回答

1

好吧,讓我們這個給一試:

Ques1。任何人都可以告訴我以下程序的輸出以及它的工作原理嗎?

的構件operator newoperator delete將創建和銷燬Base類的對象(及其派生類,除非他們宣稱自己的)時使用。

它期望的輸出:

大小4
刪除
尺寸128 刪除

或東西接近(大小Derived 128是猜測)。

Ques2。如果我寫Base * bp = new Derived;在這種情況下會發生什麼?

它會工作。 operator newsize參數將獲得Derived的正確大小。

但是,像往常一樣,你會如果你試圖通過一個指針來刪除DerivedBase,當Base沒有虛析構函數陷入困境後。

問題3。新運算符自動調用構造函數,所以在重載新運算符的時候,我可以如何調用構造函數?

這是調用構造函數的新表達式new Derived。這與operator new不一樣,即使名稱非常相似。

編譯器將添加代碼來調用正確的構造函數,您不必這樣做。

Ques4。是否有必要重載類中的new和delete操作符?

operator new(size_t size)將收到合適大小的內存分配。