2011-11-14 22 views
0

我做了一個包含兩個類的程序。基類包含其派生類的指針對象。然後我在基類的構造函數中初始化指針對象。如何解決基類中的內存分配錯誤?

我的編譯器在編譯過程中不會出錯,但是當出現控制檯窗口時程序崩潰,給出派生類的對象的錯誤UNHANDLED EXCEPION BAD ALLOCATION。我該怎麼做才能解決它?

下面是代碼:

class x; 

class y 
{ 
    private: 

     x *objx; // here is the error 
    ........................... 

}; 

class x: public y 
{ 
    ........................... 
    ................ 
}; 

y::y() 
{ 
    objx=new x(); // bad allocation and the program crashes 

    // I have also tried this way by commenting objx=new x(); 

    *objx=0; // but still the program crashes. 
} 
+0

請修復您的代碼縮進。 – Tudor

+0

這是什麼語言?你應該相應地標記它。 – jonsca

回答

1

由於調用在派生類的構造函數調用中,它看起來父類的構造函數一樣,你將有一個遞歸結構問題對那裏發生的 - 這可能是造成例外。

爲了避免這種情況,您可以將構造函數中的「new x()」移動到它自己的函數中。

+0

但編譯器在派生類的數據成員的初始化中給出錯誤。現在我該怎麼做! –

1

正如另一個答案中所解釋的那樣,您有一個無限遞歸構造問題。你可能會想嘗試在構造函數指針設置爲空,並創建初始化的方法,這將使實際的對象:

y::y() 
{ 
    // *objx=0; // this is wrong, you don't want to dereference your pointer. 
    objx = 0; // this should work 
} 

void y::init() 
{ 
    objx = new x(); 
} 
+0

我也試過了。但前面提到的問題是,當我這樣做時,父類Y和派生類x的數據成員仍未初始化,我不這麼做! –

+0

錯誤彈出爲 pacman.exe中0x00401dd9未處理的異常:0xC0000005:訪問衝突讀取位置0x00000020。 對於類x和y的所有數據成員 –

+0

是否確定在創建對象y後調用init()? Y y; y.init(); – Barth