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时,所有这些都消失了
工作流~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;
};