2010-05-23 93 views
2

ok, 所以我得到了一些複雜的程序,模擬單元學生,單位和學生的uni系統。C++析構函數導致崩潰的

學生存儲在二叉搜索樹中, 單元存儲在標準列表中。

學生有一個單元指針列表,用於存儲他/她所登記的單元 單元有一個學生指針列表,用於存儲在該單元中註冊的學生。

單元集合(在列表中存儲單元),作爲主函數所在的靜態變量,以及學生的二進制搜索樹。

當它的finaly時間關閉程序時,我調用每個的析構函數。但在某個階段,在單元端的破壞程序期間,

ClassAllocation.exe中的0x002e4200未處理的異常:0xC0000005:訪問衝突讀取位置0x00000000。

UnitCollection析:

UnitCol::~UnitCol() 
{ 
    list<Unit>::iterator itr; 
    for(itr = UnitCollection.begin(); itr != UnitCollection.end();) 
    { 
     UnitCollection.pop_front(); 
     itr = UnitCollection.begin(); 
    } 
} 

單位析構函數

Unit::~Unit() 
{ 
} 

現在我有對事物的學生側相同八九不離十問題

BST的析構函數

void StudentCol::Destructor(const BTreeNode * r) 
{ 
    if(r!= 0) 
    { 
     Destructor(r->getLChild()); 
     Destructor(r->getRChild()); 
     delete r; 
    } 
} 

StudentCol::~StudentCol() 
{ 
    Destructor(root); 
} 

學生析構函數

Student::~Student() 
{ 
} 

所以是任何幫助,將不勝感激

+0

在BTreeNode析構函數中發生了什麼? – 2010-05-23 03:33:35

回答

3

如果您UnitCollectionstd::list<Unit>那麼您不必手動刪除的項目 - 本身銷燬包含的對象列表,並解除分配內存它自己的析構函數。

看看std::list documentation

我還建議你發佈完整的代碼 - 你的一些描述是矛盾的。

+0

ok,那麼desturctor會調用列表中所有單位對象的單位析構函數? – user348120 2010-05-23 03:35:54

+2

是的,當你將一個對象放入STL容器時,一個* copy *被製作成容器管理的內存。當容器被破壞時,該副本被破壞,並釋放內存。 – 2010-05-23 03:50:55