2011-02-01 7 views
0

intまたはchar(ポインタではありません)をクリーンアップするためには何が必要ですか?バグを避けるには、スタックを消去する必要がありますか?

使用後にこのタイプのデータをクリーンアップする必要がありますか?

サンプル例:

 // MAX = 100 ; 
     class Simple { 
       int a[ MAX ] ; 
       public : 
        ~Simple () ; 
        ... // some declaration to fill, initialize ... 
     }; 

が、それは、例えば、スタック上のデータをクリーンアップするために不可欠ですこの例の配列a[ MAX ]

+0

実際の問題(または問題と思われるもの)を説明するコードサンプルを提供してください。 – sharptooth

+1

質問はあまり明確ではありません。例を挙げますか? – Muggen

答えて

2

を発生しますしない場合は、あなたが本当に彼らにそのデータストアを気にしない限り、intまたはchar配列を上書きする必要はありませんあなたのプログラムからパスワードのような機密データを取得するために何らかの形で使用することができます。

詳細については、thisおよびthisの質問を参照してください。おそらくそれについて心配する必要はありません。

しかし、を上書きするメモリをに割り当てると、というメモリが割り当てられます。 newを使用してclass Simpleのインスタンスを割り当てる場合は、deleteを使用してインスタンスを割り当て直してください。そうでない場合は、メモリリークが発生します。

2

あなたは、新しいまたは新しい[](またはmallocのような同等の機能)で割り当てたものだけをクリーンアップする必要があります。スタック上に割り当てられ オブジェクトは、自動的に(これは各クラスにデストラクタを呼び出す意味)(あなたの例でa

0

自動変数の関数の戻りに破壊が両端を含有しているコードのブロックの後に有効期限が切れています。それはあなたが何を意味するかである場合foo()が終わった後

void foo() 
{ 
    int x; 
    char z; 
    int * y = new int(5); 
    ... 
    return; 
} 

xzはもはや存在しません。 しかし何yポイントすぎてまだあなたdelete yない限り、存在し、そしてあなたがメモリリークが

0

intまたはcharデータには特別なクリーンアップは必要ありません。コンパイラは、ローカル変数が一時的なスタック上に配置されるように設定します。一時的なスタックでは、メモリが使用目的のために予約されていますが、それらを宣言している関数またはブロックがスコープ内にあるときに値が残され、 。 newまたはmallocからのintおよびcharデータは、deleteまたはfreeを使用して割り当て解除できますが、古い内容はさらにメモリが残っています.またはmallocがメモリを再利用するまで残ります。静的変数は、プログラムのランタイムを通じて存在します。プログラムが終了すると、メモリはオペレーティングシステムに解放され、別のプログラムが読み込みを許可する前に予測可能な状態に戻すことができます。理由はセキュリティのためです。閉じたアプリケーションからのデータが他のアプリケーションおよび/またはユーザを含む。

あなたのコードでは、デストラクタによってクラスのint配列に何もする必要はありません。

0

他の人が指摘しているように、通常はnewまたはmallocで割り当てられたものだけを明示的にクリーンアップ(リリース)する必要があります。

私はちょうど1つの少しやっかいなディテールを追加します:あなたのa[]配列は、あなたが他の場所で解放しません(このような場合のために、古いスタイルのWindows GDIハンドル、など)リソースにハンドルを表す整数を含まなければならない場合は、アプリケーションを誤動作して最終的にクラッシュするでしょう。

関連する問題