2012-12-03 7 views
11

を解放するためにどのように可能性の重複:適切ベクトルのC++ベクトルを破壊し、メモリに


How to release std::vector if there is no heap memory

C++のnoobここ

は、私は次のようにベクトルのベクトルを宣言すると仮定します

vector<vector<vector<double> > > phi_x; 

私はそれを使い終わった後、どのようにメモリを解放するためにそれを破壊するのですか?

私は他のサイトも読んでおり、.clear()を使用することをお勧めします。私の理解から、これは要素を削除するだけですが、ベクトルの容量は解放されません。私は、決して存在しなかったように、ベクターを完全に忘れて欲しい。

また、私の現在のベクターのアプリケーションは54x54x9のサイズを持っており、私はこれらのものの約12を持っています。それは愚かに大きいと考えられていますか?

+0

しかし、このベクトルのベクトルのベクトル、それは非常に異なる質問です – thecoshman

答えて

7

何もする必要はありません。変数を範囲外にするだけです。

+0

私は参照してくださいベクトルのメモリ割り当ては後続のコードの残りの実行を遅くしますか? –

+0

@KeenanZそうは考えにくい。参照するコードをプロファイルします。どちらの方法でも、各ベクトルの使用の周りにネストされたブロックスコープを追加することができます。 –

0

phi_x変数がブロック内のローカル変数である場合、ブロックの終わりにデストラクタを呼び出すことによって変数が破棄されます。

グローバル変数の場合は、mainが終了した後に無効になります。

2

私はそれを使い終わった後、どのようにメモリを解放するためにそれを破壊するのですか?

範囲外にする。

私の現在のベクターのアプリケーションは、54x54x9のサイズを持っており、私はこれらのものの約12を持っています。それは愚かに大きいと考えられていますか?

によって異なります。 64kのメモリを搭載した組込みプラットフォームの場合は、それは大きいです。 4G + RAMを搭載した標準的なデスクトップPCの場合、それは無視されます。

7

.clear()に電話すると、内部ベクトルが完全に破棄されます。しかし、最も外側のベクトルは、そのベクトルの配列(phi_x.size() * sizeof(vector<vector<double> >)バイト)に使用されたメモリを保持することがあります。それ完全にクリアすると、すべてのメモリ、空のベクターとのスワップリリース:

phi_x.swap(vector<vector<vector<double> > >()); 

それとも単にphi_xがスコープ外に行きましょうと。

+0

明示的に消去すると役立ちます –

0

例のようにこのベクトルがある場合、追加のクリーンアップは必要ありません。デストラクターが範囲外になるとメモリは適切に解放されます。

これは、終了時に関数が宣言されるか、またはそれが存在するオブジェクトが破棄されるとすぐに発生します。

0

デストラクタは、あなたのためにクリーンアップの仕事をします。あなたは何もする必要はありませんが、phi_xを有効範囲外にする必要があります。

{ 
    vector<vector<vector<double> > > phi_x; 

    // do stuff with phi_x 
} 
// phi_x is gone here 
1

デストラクタは正常にクリーンアップされます。

範囲外になる前にメモリ使用量を解放したい場合は、トップレベルでクリアすることができます。これにより、先頭のベクトルで使用されているメモリは再割り当てされませんが、含まれているすべてのベクトルが削除され、デストラクタでメモリが解放されます。

私はそれを正しく計算すれば、それはダブルタイプの約100万要素です。近代的なPCを、愚かではないプラットフォームとして想定します。あるいは非常に大きい:)

関連する問題