2013-01-23 73 views
2

因此,考慮這個簡單的場景:在構造函數中動態分配新的對象

class A{ 
public:   
    A(){ 
     n = new int(10); 
    } 
    ~A(){ 
     delete n; 
    } 
    int* n; 
}; 

int main(){ 
    A* a = new A(); 
} 

可這導致堆損壞(一般問題),因爲指針沒有完成分配,而我正在做一個新的分配?

如果是這樣,在堆構造函數中使用std :: vector也是禁止的,對嗎?

謝謝。

+0

'類A()'?你的意思是'A級'? – billz

回答

2

您的a指針已完成分配

新作如​​下(簡單化)

  • 分配
  • 建設

所以你的情況

  • 分配
  • 建設一個
    • 分配INT
    • 構建INT - 初始化
  • 完成建設一個

這忽略宗例外..

1

沒有「堆構造函數」這樣的事情,不,你不能在堆上的對象的構造函數中損壞堆。在調用A::A()時,new A的內存已完全分配。你正在做的事情是正確的,並且非常普遍,。您的構造函數需要永遠不要關心構造的對象是否分配在堆棧或堆上。否則,指針和類將是無用的。

1

如果「新」拋出一個異常,那麼對象未分配(注意之前的「新」的任何分配需要在其他釋放你就會有一個內存浸出)..

例外情況鑫卡特是用作錯誤系統,因爲構造函數不能返回錯誤代碼。

myclass::myclass() 
{ 
    param1 = new type1(); //successfull 
    try 
    { 
     param2= new type2(); //may fail 
    } 
    (...) 
    { 
     delete param1; //need to deallocate 
    } 
} 

這是一個有點矯枉過正,我更喜歡有在所有構造函數沒有例外,有些人讓整個frameorks與構造比可以拋出異常..

反正在分配任何其他錯誤可能導致:

段故障(訪問外的範圍值)

堆損壞(覆寫在存儲器範圍的數據,但沒有被tecnically資bythe對象)

無限循環(您需要從外部中止程序,否則它將永遠不會退出分配器)。

這些都是你可以用正常的代碼當然也有主要問題。然而,默認分配器不會給出任何問題,至少可以拋出「內存不足」異常。如果你沒有足夠的內存。

+0

True:但與此問題無關。還有一些你可能想要糾正的語法錯誤。 –