5

重複の可能性:
C++でのオブジェクトの破棄

2つのクラスがあり、1つはと呼ばれArray、もう1つはと呼ばれるとしMessageOnExitます。

Arrayクラスに。という静的データメンバーがあると仮定しcounterます。

クラスは次のとおりです。

class Array {
public:
    static int counter;
    Array(){counter++;}
    ~Array(){counter--;}
};

class MessageOnExit {
public:
    ~MessageOnExit(){cout << Array::counter;}
};

以下は、これらのクラスを使用する「メイン」です。

// static variable definition
int Array::counter;
// global object definition
MessageOnExit message;

void main() {
    Array a1, a2;
    Array a3(a1);
}

最初の2つの宣言は2に変更counterされ、Empty / Defaultコンストラクターが2回呼び出されます。3番目の宣言はcounter、Defaultコピーコンストラクターが呼び出されるため、変更されません。

これで、main実行が完了すると、静的メンバーの値がcounterデストラクタ-1呼び出しに続き(a1、a2、およびa3が破棄された後)、次にmessageデストラクタが呼び出され、この値(-1)が出力されます。

私の質問は、デストラクタが呼び出されているときに静的メンバーcounterがまだ生きていて利用可能であることをどのように知るかです。message

また、静的/グローバルオブジェクト/変数の定義順序を変更した場合、つまり、のmessage前に定義されcounterた場合、値は残り-1ます。

要約すると、どのような変更を行っても、プログラムがメッセージデストラクタの成功を終了して静的メンバーにアクセスするcounterと、その理由がわかりません。グローバルオブジェクトが最初に定義されているかどうかを理解している限り、messageそのデストラクタは最後に呼び出されるため、counterそのデストラクタに値を使用することはできません。

前もって感謝します!男

4

1 に答える 1

7

標準セクション3.8は次のように述べています。

タイプのオブジェクトの存続期間は、次の場合にT終了します。

  • Tが自明でないデストラクタ(12.4)を持つクラス型の場合、デストラクタ呼び出しが開始されます。

  • オブジェクトが占有するストレージは、再利用または解放されます。

現在intはクラスタイプではなく、Array::counter静的なストレージ期間があるため、そのストレージが解放されることはありません。したがって、の寿命はArray::counter決して終わりません。必要なデストラクタから安全にアクセスできます。

于 2013-01-16T16:50:04.057 に答える