2015-01-11 92 views
-1

我有這個類:析構函數錯誤

class A{ 

    private: 

    int * intArr; 

    int countInt; 

    public: 

    A(){ 
     countInt=0; 
    } 

    SetArray(countInt){ 
     intArr=new int[countInt]; 
    } 

    ~A(){ 
     delete []intArr; 
    } 

}; 

而且我也有這個類:

#define MAX_SIZE 10 
class B{ 

    private: 

    A * Aelements; 

    public: 

    B(){ 
     int num; 
     Aelements=new A[MAX_SIZE]; 
     //reading number from file 
     //.... 
     //num=something 
     for(int i=0;i<MAX_SIZE;i++) 
     Aelements[i].SetArray(num); 
    } 

    static void test(){ 
     try{ 
     B b; 
     //do something... 
     } //here supposed to call ~A() 
     catch(){ 
     //handle errors.... 
     } 
    }; 

B創建A元素的數組使用A默認構造函數,然後調用SetArray()創建int數組到每個A元素。

我的問題是:

  1. 當我打電話B::test(),它不叫~A()。當try{}完成時,應調用A的析構函數。

  2. 如果我強迫調用它,通過使~B()

    ~B() 
    { 
        delete [] Aelements; //Calling ~A() 
    } 
    

    我得到這個消息調用~A()(當try{}完成)後:

    調試斷言失敗! _BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)

如何使用析構函數的正確方法是什麼?

+1

1.爲什麼要調用'A〜()'?你還沒有刪除動態分配的'A'數組。 2.顯示一些導致失敗的代碼。最有可能的是,你需要遵循*三條規則*。 – juanchopanza

+1

對於C++來說,這很多'new'和'delete'。你有沒有考慮過使用標準容器? – Biffen

+0

標準容器是什麼意思? – user3572267

回答

0

使用new表達式創建的對象存在,直到它被delete表達式(或等效代碼)銷燬。

您沒有任何delete表達式或爲您執行此操作的對象,因此new -ed對象只是繼續存在。

直接修復方法是使用智能指針,如std::unique_ptr而不是原始指針。更好的解決辦法是使用std::vector而不是DIY原始數組。這些修復程序負責以不同方式進行復制:std::unique_ptr禁用複製(可以移動但不能複製),而std::vector支持複製。