gpt4 book ai didi

c++ - Visual C++ 运行时对象销毁顺序

转载 作者:行者123 更新时间:2023-11-28 03:22:31 27 4
gpt4 key购买 nike

我偶然发现了一个相当烦人的问题,它与 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 中的封装实例并使其指针无效。这并不是真正相关的,重要的是它使用的是 static list 并且它在构造函数/析构函数中访问这个列表。我在定义了 MyClass 的文件中初始化了 refed_list

现在,问题.. 当我的程序关闭时,运行时会在某个时候清理 refed_list,然后清理 MyClass 的实例,调用它们的析构函数.然后他们尝试访问已经清理过的 refed_list。这导致我的迭代器不正确,并且出现未定义的行为,在本例中为调试断言失败。

有没有办法解决这个问题?我怀疑我是否可以指定销毁不同编译单元中的哪些顺序对象,但是有没有办法检查 refed_list 是否仍然有效?目前,我检查 refed_list.size() == 0 是否有效,但它的行为也是未定义的(我认为?)。

最佳答案

您始终可以使 refed_list 成为在启动时初始化的指针。这样它就永远不会被清理干净。 (当您的进程退出时,它使用的任何内存都将由操作系统回收。)

如果这听起来像是解决更深层次设计问题的 hack,那么它可能是。 :)

关于c++ - Visual C++ 运行时对象销毁顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15050713/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com