2013-08-02 9 views
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; 

、メインは、ここでは重要ではありません。

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

ときcleanup()が呼び出されました。objects配列に割り当て解除された/無効なメモリが含まれていますか?初期化/破壊の標準的なシーケンスは、誰かがおそらく私を指すことができるここで実装しているか?

おかげ

編集:私はこの種のコードはおそらくベストプラクティスではありません理解しますが、動作が定義されている場合、私はまだ疑問に思って。

+5

時間が初期化されるので、はい、グローバル私のクラスが最初に破壊されます –

+0

@CaptainObvlious lol私は私の答えに同じリンクを入れようとしていた – aaronman

+1

静的記憶期間を持つオブジェクトの初期化と破壊のための標準的な定義されたシーケンスはありません。これは[static initialization order fiasco](http://www.parashift.com/c++-faq/static-init-order.html)と呼ばれます。 – Praetorian

答えて

3

静的変数と大域変数の両方がstatic storage durationであり、プログラム終了時に解放されます。重複のいずれかを読んでから、コードがすべて同じ翻訳単位(あなたのもの)であれば、静的記憶域を持つオブジェクトは逆順で破棄されることがわかりました。オブジェクトが異なる翻訳単位にある場合は、何も保証することはできません。

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

はいますが、オブジェクトがスコープ外

したら、それが唯一と呼ばれているので、それは本当に問題ではありませんglobal_my_classはexecute_around_main前に破壊されていますか?

それは、[保存期間](http://en.cppreference.com/w/cpp/language/storage_duration)に慣れるために、最後の

+0

"C++で実装されている初期化/破壊の標準シーケンスはありますか?"プログラムが終了しても解放されているという事実は、 'global_my_class'のメモリが' execute_around_main' 。 –

+0

@MooingDuckだから私は半分の質問に答えるだけで、あなたがダウンボートする必要があると感じたら、私は答えを修正しようとしますが、彼は何を尋ねようとしているのかはっきりしていません – aaronman

+0

"cleanup()オブジェクト配列に割り当て解除された/無効なメモリが含まれていますか? " - > "' global_my_class'は 'execute_around_main'の前に破壊されていますか?" –

関連する問題