5

我想知道是否有人可以对 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;

main 在这里并不重要:

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

何时cleanup()调用,objects数组现在是否包含已释放/无效的内存?是否有 c++ 在这里实现的标准初始化/销毁序列,有人可能会指出我?

谢谢

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

4

1 回答 1

3

静态变量和全局变量都具有静态存储持续时间,这意味着它们在程序结束时被释放。通过阅读其中一个副本,我发现如果代码都在同一个翻译单元(你的翻译单元是)中,那么具有静态存储的对象将以相反的构造顺序被破坏。如果对象位于不同的翻译单元中,则您无法保证任何事情。

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

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

global_my_class 在 execute_around_main 之前被破坏了吗?

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

于 2013-08-02T19:55:40.800 回答