C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の静的(static)オブジェクトはいつ破棄されるのか?仕組みをサンプルコード付きで解説

C++において、静的(static)オブジェクトとは、キーワードstaticを付けて宣言されたオブジェクトのことです。静的オブジェクトはプログラムの実行中に一度だけ初期化され、静的記憶域(static storage area)と呼ばれる特別なメモリ領域に格納されます。

そして重要なポイントとして、静的オブジェクトが破棄されるのはプログラムが終了するときだけです。つまり、静的オブジェクトはプログラムが終了するまで存続し続けます。通常のローカル変数やオブジェクトは、スコープを抜けると自動的に破棄されますが、静的オブジェクトにはそのようなことは起こりません。

静的オブジェクトのサンプルコード

以下は、C++で静的オブジェクトを使用する様子を示すサンプルプログラムです。

#include <iostream>
using namespace std;
class Base {
    public :
    int func() {
        int a = 20;
        cout << "The value of a : " << a;
    }
};
int main() {
    static Base b;
    b.func();
    return 0;
}

実行結果

上記プログラムの出力は次のようになります。

The value of a : 20

プログラムの解説

それでは、このプログラムの動作を順番に見ていきましょう。

まず、クラスBaseのメンバ関数func()では、int型の変数aを宣言し、その値を画面に表示しています。該当するコード部分は以下の通りです。

class Base {
    public :
    int func() {
        int a = 20;
        cout << "The value of a : " << a;
    }
};

続いて、関数main()の中で、クラスBase静的オブジェクトbが生成され、メンバ関数func()が呼び出されています。

ここで注目すべきは、オブジェクトbstaticキーワード付きで宣言されている点です。bは静的オブジェクトであるため、main()関数のスコープが終了しても破棄されず、プログラム全体が終了する瞬間まで生存し続けます。該当するコード部分は以下の通りです。

int main() {
    static Base b;
    b.func();
    return 0;
}

まとめ

このように、C++の静的オブジェクトは以下の特徴を持っています。

  • staticキーワードを使って宣言する
  • プログラムの実行中に一度だけ初期化される
  • 静的記憶域に格納される
  • スコープを抜けても破棄されず、プログラム終了時にのみ破棄される

デストラクタを持つクラスの静的オブジェクトの場合、そのデストラクタも同様にプログラム終了時(正確にはmain()終了後の静的オブジェクトの破棄フェーズ)に呼び出される点も覚えておくと良いでしょう。

  1. C++で3つの点が同一直線上にあるかどうかを判定するプログラム

    3つの異なる座標を持つ点が与えられ、それらの点が同一直線上に並んでいるかどうか(共線性・コリニア)を判定するのが本記事のテーマです。3つの点がすべて同じ直線上に乗っている場合、これらの点は「共線(collinear)」であるといいます。逆に、異なる直線上に配置されている場合は共線ではありません。以下の図は、共線な点と共線でない点の違いを示したものです。入力例と出力例入力1x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5出力1no points are not collinear入力2x1 = 1, y1 = 1, x2 = 1, y2 = 4, x3

  2. C++のsigned(符号付き)とunsigned(符号なし)キーワードとは?違いと使い方を解説

    C++における符号付き・符号なしデータ型の基本C++では、すべての数値型に対して「符号付き(signed)」か「符号なし(unsigned)」かを指定できます。たとえば、int型を宣言する際に正の整数のみを扱うよう指定することも可能です。特別な指定がない場合、すべての整数型はデフォルトで符号付き(signed)として扱われます。つまり、正負どちらの値も保持できるということです。一方、unsignedキーワードを使用すると、符号を持たない変数を宣言できます。サンプルコード#include<iostream>using namespace std;int main() { &