2010-05-23 88 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