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

静的変数とグローバル変数はどちらも静的な保存期間を持ち、プログラムの終了時に解放されます。重複の1つを読んだところ、コードがすべて同じ翻訳単位(あなたのもの)にある場合、静的ストレージを持つオブジェクトは構築の逆の順序で破棄されることがわかりました。オブジェクトが異なる翻訳単位にある場合、何も保証できません。

cleanup() が呼び出されたとき、オブジェクト配列には割り当て解除された/無効なメモリが含まれていますか?

はい、オブジェクトがスコープ外になったときにのみ呼び出されるため、実際には問題ではありません

execute_around_main の前に global_my_class は破棄されますか?

はい、グローバル 私のクラスは最後に初期化されるため、最初に破棄されます

于 2013-08-02T19:55:40.800 に答える