【发布时间】:2011-05-10 06:07:03
【问题描述】:
我需要从析构函数中访问一个静态数据成员,但在程序退出时似乎不能保证它仍然存在!出于某种原因,静态成员正在被销毁,而该类仍有未完成的实例。这很奇怪,因为我以前从未听过“永远不要从析构函数访问静态成员”的建议,但我想如果它存在的话我会知道这样的限制。
我举个具体的例子:
class MyClass {
public:
~MyClass() { m_instances.erase(m_name); }
private:
long m_name;
static std::map<long, MyClass*> m_instances;
};
在另一堂课中,我尝试了以下令人讨厌的 hack,它似乎有效,但当我考虑它时,我认为它根本不是一个真正的解决方案。
class MyClass {
friend class Switch;
public:
~MyClass() { if (m_alive) m_instances.erase(m_name); }
private:
static bool m_alive;
class Switch {
~Switch() { MyClass::m_alive = false; }
};
static Switch m_switch;
long m_name;
static std::map<long, MyClass*> m_instances;
};
如果 MyClass 的实例在 m_instances 之后 m_switch 之前被销毁怎么办?即使 m_switch 先死,布尔值 m_alive 也可能已被“破坏”,因此可能被覆盖为“真”(我知道不太可能)。
那么谁能提供更好的解决方案?我希望我在这里遗漏了一些非常明显的东西。
【问题讨论】:
-
对我来说似乎很奇怪。你遇到过什么编译器/平台?
-
是什么在程序退出时保持
MyClass的实例以使其析构函数正在运行? -
不知是不是类似这样的情况:parashift.com/c++-faq-lite/ctors.html#faq-10.16
-
你在说什么
m_switch?上面的代码中没有m_switch。 -
当然你可以从析构函数中访问全局变量和静态变量。
标签: c++ segmentation-fault destructor static-members