0

我有一个私人会员

std::list<MyClass*> myclass_list;

这是其他类的一部分。

当我关闭控制台应用程序时,将调用 OtherClass 的空析构函数。问题是,在析构函数调用期间 - OtherClass 中的某些方法想要迭代 myclass_list - 例如

for(std::list<MyClass*>::iterator it = myclass_list.begin(); it != myclass_list.end(); ++it) {      
    // do stuff
}

现在,即使 myclass_list 是空的(并且在其生命周期内从未为其分配/添加单个变量) - for 循环将至少迭代一次 - 基本上访问不存在的 MyClass 对象。

当我从 std::list 切换到 std::vector 时,这一切都消失了。

  1. 此处列表的 STL (VS2010) 有什么问题?我如何检查无效列表(!= 0 或 !vector 不起作用,没有重载运算符)。
  2. 我认为它适用于向量,因为它使用连续内存,因此循环永远不会被执行。

编辑:好的,我认为问题可能在于访问无效的 Otherclass 对象,该对象当前调用了析构函数。Otherclass 是一个全局对象。

工作流程 ~OtherClass -> 删除 someMemberObject -> ~someMemberObject -> otherclass->CheckMyClassList(someMemberObject) -> 崩溃

4

1 回答 1

1

成员变量的析构函数以声明的相反顺序调用。

所以,如果任何成员变量的析构函数需要访问其他成员变量,那么使用的变量应该在之前声明:

class OtherClass
{
    std::list<MyClass*> myclass_list;
    someMemberObject member;
};

如果变量以相反的顺序定义,那么当~someMemberObject()被调用时,myclass_list析构函数就会被调用,任何使用它都会导致未定义的行为。

于 2012-07-02T22:14:55.153 回答