2011-01-12 6 views
0

は、デモの目的のためにこのクラスを考えてみましょう:質問について削除()クラスのインスタンスとその静的メソッド/変数

class test{ 
private: 
    int y; 
    HANDLE handle; 
    static int x; 

public: 
    test() 
    int add(); 
    static int sub(); 
} 


test::test() { 
    [....] 
    sub = 1; 
    handle = (HANDLE)_beginthreadex(NULL,0,&test::sub,NULL,0,0); 
} 

test::sub() { 
    [....] 
    _endthreadex(0) 
} 

私は静的メソッド/変数についてはほとんどわからないと私は今、いくつかの質問を持っています。

1)テストのクラスインスタンスを作成してからdelete testを呼び出すと、静的変数もクリーンアップされますか?そうでない場合は、delete()を使ってデストラクタ内のすべての静的変数を手動でクリーンアップする必要がありますか(またはfree()ですか)?

2)スレッドが実行されているときに_endthreadexで終了すると、静的メソッドで手動クリーンアップが実行されますか?ご覧のように、ハンドル変数はスレッドを参照しています。事前に

おかげ

答えて

4

静的変数はプログラムの寿命を持っています。プログラムが開始すると作成され、プログラムが終了すると破棄されます。 1つだけ存在し、個々のオブジェクトには存在しません。

+0

静的変数は、クラス内に名前があるグローバル変数と考えるのが役に立ちます。 –

+0

@Michael - 私はそのように考えていましたが、グローバルはスコープで、生涯ではなく、静的変数はプライベートであると認識しました。グローバル変数は(静的変数は関数やファイルに対してもローカルであるため)(静的変数は1つしかないので)静的変数であると言う方がより正確です。 –

+0

あなたが気にしなければもう1つ:test()インスタンスを削除すると、 'handle'でCloseHandle()を呼び出さなければならないのですか、インスタンスのdelete()中に自動的にクリーンアップされますか? – KaiserJohaan

0

静的変数は、クラスの1つのインスタンスから静的である別のものへと持続します。インスタンス固有のものにしたい場合は、staticキーワードを削除してください。

0

はありませんは、static変数の割り当てを解除しようとします。あなたがこれをやりたいと思っているのであれば、本当にstaticを使用したくないかもしれません。

0

static intは、BSS or Uninitialised Data Sectionに存在するため、他の人も示唆しているように、プログラムの有効期間に利用可能になります。

+0

'BSSまたはUninitialised Data Section'のようなものはありません。これはローカルな実装の詳細です。それは '静的記憶期間'です。 –

+1

Windowsではwinapiと言われましたが、IBM PC互換のプログラムなので...私はまだ私の主張の通りだと思いますか? –

+0

まあ、ARMのWindows CEもWinAPIの一部を実装しています。まだPEフォーマットなので、初期化されていないデータセクションは実際にはこの意味で意味を持ちます。 – MSalters

1

キーワード 'static'は、この例では、メモリ内に変数のインスタンスが1つしか存在しないことを意味し、クラスtestに「属する」ことを意味します。テストのインスタンスがなくなってからずっと待っていれば、変数test :: xは残っていて、他のインスタンスの 'test'と静的な 'sub'関数(プライベート変数)からアクセスできます。この単一のインスタンスのみがメモリに存在するため、クリーンアップは不要です。

静的にする理由が 'sub'でアクセスできるようにする場合は、代わりにパラメータとして渡すことができます。あるいは、 'test'インスタンスをスレッドメソッドに渡すことができます。そして、オブジェクト上で非静的関数を呼び出すことができるように、もはや静的である必要はありません。

関連する問題