13

重複の可能性:
ヒープメモリがない場合に std::vector を解放する方法

ここにc ++ noob

次のようなベクトルのベクトルを宣言するとします。

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

使い終わったら、破棄してメモリを解放するにはどうすればよいですか?

私は他のいくつかのサイトを読みましたが、.clear() の使用を推奨しています。私の理解では、これは要素を削除するだけで、ベクトル容量は解放されません。ベクトルが存在しなかったかのように完全に忘れ去られることを望んでいます。

また、ベクトルの現在のアプリケーションの寸法は 54x54x9 で、約 12 個あります。それはばかげて大きいと考えられていますか?

4

7 に答える 7

13

何もする必要はありません。変数をスコープ外に出すだけです。

于 2012-12-03T08:36:38.430 に答える
10

を呼び出す.clear()と、内部のベクトルは完全に破棄されます。ただし、最も外側のベクトルは、そのベクトルの配列 (phi_x.size() * sizeof(vector<vector<double> >)バイト) に使用したメモリを保持する場合があります。完全にクリアしてすべてのメモリを解放するには、空のベクターと交換します。

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

または、単にphi_x範囲外に出してください。

于 2012-12-03T08:37:50.287 に答える
4

使い終わったら、破棄してメモリを解放するにはどうすればよいですか?

範囲外にするだけです。

ベクトルの現在のアプリケーションの寸法は 54x54x9 で、約 12 個あります。それはばかげて大きいと考えられていますか?

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

于 2012-12-03T08:37:40.650 に答える
2

何もする必要はありません。デストラクタが適切にクリーンアップします。

範囲外になる前にメモリ使用量を解放したい場合は、最上位レベルで clear を呼び出すことができます。これにより、最上位のベクターが使用するメモリが再割り当てされることはありませんが、含まれているすべてのベクターが削除され、デストラクタでメモリが解放されます。

正しく計算すると、これは double 型の約 100 万要素です。最新の PC を、それほど大きくないプラットフォームと仮定します。または非常に大きい:)

于 2012-12-03T08:39:22.773 に答える
1

デストラクタは、クリーンアップの仕事をします。何もする必要はありませんが、phi_x を範囲外に出させてください。

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

    // do stuff with phi_x
}
// phi_x is gone here
于 2012-12-03T08:38:43.023 に答える
0

変数がブロック内のローカル変数である場合、phi_xブロックの最後でデストラクタが呼び出されることで破棄されます。

グローバル変数の場合、main終了後に破棄されます。

于 2012-12-03T08:37:30.850 に答える
0

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

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

于 2012-12-03T08:38:15.063 に答える