2017-08-24 10 views
1

C++でnewを使用して静的データメンバーを宣言できますか? 静的データメンバーをnewで宣言できれば、その静的データメンバーを初期化する方法は?どこへ行く新しい演算子を持つクラスの静的メンバー変数

class A 
{ 
    static int *p = new int;  
} 

int * A :: p = 
+0

クラスの外部でのクラス、定義、および初期化における変数のインライン宣言。それは最も簡単です。 –

+0

それは良いですが、私の質問は、私はクラス内で新しいを使用して静的変数を宣言することができます –

+0

いいえ..静的な値はヒープには存在しません –

答えて

3

の方法は、クラス内の変数を宣言し、それ以外でそれを初期化することです:

class A { 
public: 
    static int* anIntPointer; //<- declaration 
}; 

int* A::anIntPointer = new int(42); //<- initialisation 

プログラムのみを終了したとき以来、あなたはまだ手動でメモリをクリーンアップする必要があるだろうがポインタは削除されますが、(OSがメモリを追跡してプログラムが終了した後にクリーンアップしない限り)ポインタが指すメモリは残っています。したがって、delete A::anIntPointerとしてください。 mainの末尾にあります。

C++へのアクセス権がある場合は、直接初期化できるメンバーinlineを宣言できます。とにかく

class A { 
public: 
    inline static int* anIntPointer = new int(42); //<- declaration + initialisation 
}; 

自分でメモリをクリーンアップするための責任を負うことにしたくない場合は、スマートポインタ(std::auto_ptr<>前にC++ 11、std::unique_ptr<> C++ 11以降)を使用することができます。 A::anSmartPointerは、あなたのプログラムの終了時に破棄されます

class A { 
public: 
    static std::unique_ptr<int> anSmartPointer; 
}; 

std::unique_ptr<int> A::anSmartPointer = std::unique_ptr<int>(new int(42)); // C++11 
// std::unique_ptr<int> A::anSmartPointer = std::make_unique<int>(42); // or C++14 style 

、それが自動的に制御するメモリをクリーンアップします。

Here私はちょうど説明したすべての事例(C++ 17 inline staticスマートポインタのような)の実例を見ることができます。

+0

C++ 11以降では、 'std :: unique_ptr <>'の仕事のように聞こえる場合は、以前に歯を荒らして 'std :: auto_ptr <>'を使うか、独自のロールを使用してください。 – Persixty

+0

ここでポインタは静的変数で、ポインタが指しているデータはヒープ上にあります。 – Viktor

+1

@Viktor Correct。 – muXXmit2X

関連する問題