2011-12-17 6 views
1

私はC++でベクトルに奇妙な問題があります。C++ベクタの割り当てを正しく解除または削除するにはどうすればよいですか?

ベクトルを作成し、10000の整数値を挿入してメモリ使用率を確認しました。それは600kbです。しかし、私はベクトルを消去した後、私のシステムモニタは、プログラムが600キロバイトを使用していると言います。

メモリが解放取得されていない理由は、誰もが、私はベクトル

注意消去した後でも説明することができます:私は削除のためのすべてのメソッドを使用していたが(それでも私は...明確な、pop_back、pop_frontを消去同じ問題)

おかげに関して... :)

+0

なぜそれはあなたのメモリあなたが削除を起動するたびに解放する必要がありますか? – akappa

+0

ちょっとしたコードを書いてください。 – ybakos

答えて

5

std::vector<> pre C++ 11で使用されていないメモリを実際に除去する唯一の方法は、空のベクトル:vector<int>().swap(myvec)で置き換えることです。 C++ 11では、メンバー関数shrink_to_fitがあります。この関数は、今説明したスワップイディオムとして実装されることがよくあります。

0

は、各要素を削除して、ベクター自体を削除してみてください - それはどんな違いがあればご覧ください。 valgrindを使用してメモリリークがあるかどうか調べましたか?

+0

私はすべての値を飛び出しました。でも私は同じ問題を抱えています – user650521

2

C++ベクタは、新しい要素の追加を高速化するために要素に必要なメモリよりも多くのメモリを予約し、要素が削除された後は予約されたメモリを解放しません。 予約されたメモリの量をすべての要素の実際のサイズと一致させるために、ベクトルをスワップしてみることができます:v.swap(v)

9

おそらくあなたはいくつかのシステムユーティリティでメモリをチェックしました。ベクトル空間がヒープ上で解放されたとしても、ヒープ領域自体はOSに返されず、システムユーティリティに示された値に反映されます。

0

消去削除イディオムを使用してみてください。あなたがベクトルからすべての要素を消去しているのであれば、end()イテレータを動かすだけです。だから、すべてがまだベクトルの中にありますが、 "利用できません"。

http://en.wikipedia.org/wiki/Erase-remove_idiom

0

次のコードでは、答えを与える:

#include <cstdio> 
#include <vector> 

struct Foo 
{ 
    ~Foo() 
    { 
     printf("~Foo()\n"); 
    } 
}; 

int main() 
{ 
    std::vector<Foo> v; 

    v.push_back(Foo()); 

    // This causes all Foo instances to be released as well as all 
    // space allocated by the vector to be released. 
    v = std::vector<Foo>(); 

    // As you can see, all printf("~Foo()\n") calls happen before this 
    // line is printed. 
    printf("~~~~~~~~~~~~~~\n"); 

    return 0; 
} 
関連する問題