2013-05-18 71 views
1
class Base 
{ 
private: 
    int nID; 
    friend int fnDeleteBase(Base* base); 
public: 
    Base(int baseID):nID(baseID) { cout << "Base Constructed with value" << endl; } 
    Base() : nID(5){cout << "Base Constructed WITHOUT value" << endl; } 
    ~Base() { cout << "Base class object killed " << endl; } 
}; 

int fnDeleteBase(Base* base)       // Line 1 
{ 
    delete base;          // Line 2 - important 
    cout << "Base object deleted " << endl; 
    return (1); 
} 

int main() 
{ 
    Base aBase;          // Line 3 
    try 
    { 
     int i = fnDeleteBase(&aBase);     // Line 4 
    } 
    catch(...) 
    { 
     cout << "Exception handled " << endl; 
    } 

    return (0); 
} 

上面的代碼片段我正在調試。我無法在第2行中刪除基礎對象。當我試着踏入或碾過線2時進入,我要殺死調試或執行我失去控制,無法調試

我得到的輸出是:

Base Constructed (any of the construction is valid) 
Base class Object killed 

然而一切工作正常,如果第3行更改爲Base * aBase = new Base();。控制檯上的輸出是:

Base Constructed (any of the construction is valid) 
Base class Object killed 
Base object Deleted 

有人可以分享兩者背後的技術細節嗎?

+1

你在用什麼編程環境,Rajesh? –

+0

visual studio ultimate 2010 –

+0

順便說一句我首先嚐試fnDeleteBase參數作爲參考基地。結果與第一種情況相同。然後我試着用指針。 –

回答

4

您應該上的指針只使用delete使用new(或者被分配到使用new構建其他指針的指針),沒有例外(即我所知道的)都構建了。

使用於其他任何東西(這是在第一種情況下會發生什麼,因爲fnDeleteBase參數是指向Base aBase,這是不是指針並沒有new關鍵字存在)結果不確定的行爲delete

解釋編譯器究竟做什麼並不會真正有用,因爲在未定義的行爲下,編譯器和編譯器可能會有所不同。而且應該不惜一切代價避免。

+0

只是好奇,它是面向對象編程。它應該在我如何創建一個對象時發揮作用。我剛剛創建了一個指向該對象的指針並將其刪除。 –

+0

感謝杜克,你的迴應是有道理的。現在我也知道了,新增了我們在堆中創建對象的同時本地作用域對象自己被刪除並且堆中的對象需要刪除 –