我偶然发现了一个相当烦人的问题,它与 Visual C++ 运行时在程序退出时破坏我的对象有关。
我有一个类,用于确保对某些状态的引用是有效的。我需要将状态存储一段未知的时间,在此期间状态可能会被破坏并且我无法使用shared_ptr
. 所以我用
class MyClass
{
private:
static std::list<MyClass*> make_list();
static std::list<MyClass*> refed_list;
static void StateClosed(B* state);
public:
B* state;
MyClass(B* state);
virtual ~MyClass();
bool still_valid() const;
};
的每个实例都MyClass
将自己添加到refed_list
其构造函数中,并在其析构函数中删除自己。如果封装状态关闭,MyClass
则通知它并检查refed_list
封装实例并使其指针无效。这并不相关,重要的是它使用 astatic list
并且它在构造函数/析构函数中访问此列表。refed_list
我在定义的文件中初始化MyClass
。
现在,问题.. 当我的程序关闭时,运行时refed_list
会在某个时候清理,然后清理 的实例MyClass
,调用它们的析构函数。然后他们尝试访问refed_list
已经被清理的。这导致我的迭代器不正确,并且我得到未定义的行为,在这种情况下是调试断言失败。
有没有办法解决这个问题?我怀疑我可以指定不同编译单元中的哪些订单对象被破坏,但是有没有办法检查是否refed_list
仍然有效?目前我检查refed_list.size() == 0
它是否有效,但它的行为也未定义(我认为?)。