2011-04-28 56 views
1

请帮帮忙,静态变量释放为了

的问题:在下面的代码核心转储:

我有一个抽象类SomeOtherClass,并从中衍生SomeOtherClassImpl。

这是导致麻烦的代码:我有MyClass的类型的一些静态变量在其他翻译单元

class MyClass 
{ 

public: 

    void someFunction() 
    { 
    myVector().push_back(someOtherClassDefault()); 
    } 

private: 

    static std::vector<SomeOtherClass const *> & myVector() 
    { 
    static std::vector<SomeOtherClass const *> theVector; 
    return theVector; 
    } 

    static SomeOtherClass const * someOtherClassDefault() 
    { 
    static SomeOtherClassImpl theDefault; 
    return &theDefault; 
    } 

}; 

该问题很奇怪,因为程序退出时发生段错误。当然可以在矢量之前释放默认值,但有什么区别?当main已经完成时,两者都释放。

您的帮助将不胜感激。

+3

上面的代码我看不出任何明显的错误,所以你可能需要提供一个“SomeOtherClassImpl”的精简版本。如果您在调试器中运行应用程序,发生seg-fault时的回溯是什么? – 2011-04-28 16:27:51

+1

你认为“main已经完成”之后会发生什么事情与你无关? – 2011-04-28 16:35:26

+0

尼古拉,谢谢你激励评论:)但你是对的,这是我的事,而这实际上是我的错误。 – 2011-04-29 13:43:51

回答

4

你最有可能在相反的一端触及静态初始化失败。基本上,静态持续时间的对象的破坏顺序与创建对象的顺序相反。所以,如果您有:

void foo() { 
    static type a; 
} 
void bar() { 
    static type b; 
} 
int main() { 
    foo(); 
    bar(); 
} 

建设将创造第一a,然后bmain完成时,它会破坏b然后a。如果您在main中切换呼叫的顺序,则顺序将被反转。出于这个特殊原因,在处理依赖关系的静态持续时间变量时必须注意。

+1

没错,但是你能在OP的代码中看到为什么顺序很重要吗?我不能。 – 2011-04-28 16:43:38

+0

我不能。可能有一些其他代码在被销毁后访问这些对象中的一个。 – hammar 2011-04-28 17:45:15

+0

我在代码中看不到它,但从描述来看,这似乎是问题所在。很可能这是一个简化版本,其中的矢量替换了一些实际访问破坏参数的其他类。说一个包含向量的类,并且在销毁时遍历元素并调用成员函数。在这种情况下,该类将在元素之前创建,并且在该类的销毁期间,迭代会触及被破坏的对象。 – 2011-04-28 18:47:34