内存何时相对于静态变量解除分配? 我想知道有没有人能对C++中内存进程的分配有所启发。

内存何时相对于静态变量解除分配? 我想知道有没有人能对C++中内存进程的分配有所启发。,c++,C++,如果我有一个声明为静态的结构,那么它的构造函数是第一个要执行的,它的析构函数是最后一个要执行的: struct initializer execute_before_and_after_main { initializer() { init(); } ~initializer() { cleanup(); } } static initializer execute_around_main; 然后我有一些类似的东西: class my_class { my_obje

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

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++在这里实现,也许有人可以指点我?p> 谢谢


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

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

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

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

全局\u我的\u类在围绕\u main执行\u之前是否已销毁


是的,全局my类首先被销毁,因为它是在最后一次初始化的

时间熟悉@CaptainObvlious lol,我正要在我的回答中加入相同的链接。没有标准定义的序列用于初始化和销毁具有静态存储持续时间的对象;这被称为@Praetorian:Yes,部分地。@MooingDuck您是指如果它们在同一个TU中定义,它们将按照声明的顺序初始化吗?如果是,标准中是否真的提到了这一点?这可能只是每个实现都会做的事情之一,但不是强制要求的。。。我不知道……“C++有一个标准的初始化/破坏序列吗?”当程序结束时,它们都被释放,这一事实并不能解决在销毁
execute\u\u main
@MooingDuck期间,如果
global\u my\u class
的内存是否有效的问题,因此如果我只回答了一半的问题,你会觉得有必要投反对票,我将尝试修复答案,但我不完全清楚他想问什么“当cleanup()被调用时,objects数组现在是否包含释放/无效内存?”->“在
围绕主
执行之前
全局\u我的类
被销毁了吗?”@MooingDuck第二部分很难回答,因为他没有将其作为一个连续文件编写,但我假设全局_my_类在构建后首先被破坏after@MooingDuck我试着解决你所有的问题请随意纠正我