C++ std:list迭代器在解构器期间访问时将在空列表上迭代,std:vector不会

C++ std:list迭代器在解构器期间访问时将在空列表上迭代,std:vector不会,c++,stl,C++,Stl,我有一个私人会员 std::list<MyClass*> myclass_list; std::list myclass\u list; 这是另一类的一部分 当我关闭控制台应用程序时,调用OtherClass的空析构函数。问题是,在析构函数调用期间,其他类中的一些方法希望迭代myclass_列表,例如 for(std::list<MyClass*>::iterator it = myclass_list.begin(); it != myclass_list.end(

我有一个私人会员

std::list<MyClass*> myclass_list;
std::list myclass\u list;
这是另一类的一部分

当我关闭控制台应用程序时,调用OtherClass的空析构函数。问题是,在析构函数调用期间,其他类中的一些方法希望迭代myclass_列表,例如

for(std::list<MyClass*>::iterator it = myclass_list.begin(); it != myclass_list.end(); ++it) {      
    // do stuff
}
for(std::list::iterator it=myclass_list.begin();it!=myclass_list.end();++it){
//做事
}
现在,即使myclass_列表是空的(并且在其生命周期内从未向其分配/添加任何变量),for循环也将至少迭代一次,基本上访问不存在的myclass对象

当我从std::list切换到std::vector时,所有这些都消失了

  • 这里的STL(VS2010)列表有什么问题?如何检查无效列表(!=0或!vector不起作用-没有重载运算符)
  • 我认为它对vector很好,因为它使用连续内存,因此循环永远不会执行
  • 编辑:好的,我想问题可能是访问一个无效的Otherclass对象,当前调用了析构函数。Otherclass是一个全局对象


    工作流~OtherClass->delete someMemberObject->~someMemberObject->OtherClass->CheckMyClassList(someMemberObject)->崩溃

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

    因此,如果任何成员变量的析构函数需要访问其他成员变量,则应在以下操作之前声明所使用的变量:

    class-OtherClass
    {
    std::list myclass_list;
    someMemberObject成员;
    };
    

    如果变量的定义顺序相反,那么当调用
    ~someMemberObject()
    时,就会调用
    myclass\u list
    析构函数,使用它会导致未定义的行为。

    你能构造一个最小的测试用例吗?听起来很奇怪,空容器应该是空的,无论它是否是向量issue@Steve,但您没有添加说明,请阅读本文了解如何使用初始化和销毁顺序。最好是从代码中删除全局变量。我明白了,谢谢-在对stl::list容器执行任何操作(例如大小)之前,是否还有任何方法可以检查它是否有效?@Steve:不,对不起,一旦调用了对象的析构函数,它上的任何操作都是未定义的。因此,没有通用的方法来实现你的要求。不管怎么说,看起来你是在尝试和C++的对象系统作战…这些规则的存在有一些很好的理由,如果你遵循并利用这些规则,而不是试图绕过它们,你会做得更好。是的,我知道,谢谢-但是如果使用failsave(例如,某种容器的空检查),我的应用程序只会报告错误,而不会崩溃,我可以在以后修复它
    class OtherClass
    {
        std::list<MyClass*> myclass_list;
        someMemberObject member;
    };