什么时候内存释放与静态变量有关?

时间:2013-08-02 19:54:03

标签: c++

我想知道是否有人可以对c ++中的内存释放进程有所了解。

如果我有一个我声明为静态的结构,那么它的构造函数是第一个执行的东西,它的析构函数是最后执行的东西:

struct initializer execute_before_and_after_main {
     initializer() { init(); }
     ~initializer() { cleanup(); }
}
static initializer execute_around_main;

然后我有类似的东西:

class my_class {
    my_object objects[100];
}
extern my_class gobal_my_class;
my_class global_my_class;

并且主要在这里并不重要:

int main (int argc, char* argv[]) {
    ....
} 

调用cleanup()时,objects数组现在是否包含已解除分配/无效的内存?是否存在c ++在此实现的标准初始化/破坏序列,有人可能指向我?

由于

编辑:我理解这种类型的代码可能不是最佳实践,但我仍然想知道行为是否已定义。

1 个答案:

答案 0 :(得分:3)

静态和全局变量都有static storage duration,这意味着它们在程序结束时被释放。通过读取其中一个副本,我发现如果代码全部在同一个翻译单元(您的)中,那么具有静态存储的对象将按照相反的构造顺序进行破坏。如果对象位于不同的翻译单元中,则无法保证任何内容。

  

当调用cleanup()时,对象数组现在是否包含释放/无效内存?

是的,但这并不重要,因为只有在对象超出范围时才会调用它

  

在execute_around_main之前,global_my_class是否被破坏?

是的,全局我的类首先被破坏,因为它最后被初始化