2011-12-29 18 views
2

人、私はこのプログラミングの話題には新しくありません。今までは、グーグルで答えを見つけるのはかなり簡単でしたが、ここで私は尋ねたいことを表現するのに大変なことがありました。私は試してみましょう:ベクトルを消去すると、メモリを解放する前にデストラクタが呼び出されます。今、struct-vectorが破壊された場合、どのように反応しますか? 1つはこれらのもののデストラクタを定義しませんが、構造体が「破壊された」場合、そのメンバのそれぞれのデストラクタも呼び出されると仮定するのは正しいですか?vector :: erase()は構造体のメンバベクトルも消去します

例を挙げましょう:この場合

#include <string> 
#include <vector> 
struct ding_t { 
    std::string dang; 
} foo; 

strung boom_t { 
    vector <ding_t> chuck; 
} bar; 

int main() { 
    vector <boom_t> tom; 
    tom.resize(10); 
    tom[4].chuck.resize(5); 
    tom[4].chuck[3].dang = "jerry"; 
    tom.erase(); 

    return 0; 
} 

tom[4].chuck.resize(5); 

によって割り当てられたメモリも同様に解放されるのですか?私の語彙は申し訳ありませんが、現時点ではポインタから、より洗練されたcpp言語に相当するベクトルに移行しようとしています。私は私のポイントを得たことを願っています。事前にお世話になりました。私が言ったように、これが既に尋ねられている場合は私にリダイレクトしてください。私はこの質問をどのように囲むべきかわかりません。

+0

あなたが働いている言語のタグを追加すると、より多くの注目を集めることができます。申し訳ありませんがあなたの質問に答えることはできません。 + 1'd – vdbuilder

答えて

4

はい、メモリは自動的に解放されます。

ベクトルが破壊されると、ベクトルはそれに含まれるすべての要素のデストラクタを呼び出します。 structのデストラクタを定義していないので、コンパイラはデフォルトのものを提供します(何もしません)。あなたのベクトルは、オブジェクトへのポインタが含まれている場合は

は、しかし、それは(ベクトルはポインタ、ない尖ったオブジェクトのデストラクタを呼び出すため)ベクトルを破壊する前に、オブジェクトのデストラクタを呼び出すためにあなた責任になります、後で他の方法でアクセスすることができない場合。

2

あなたの質問への回答は、http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.11を、C++のデストラクタの非常に良い扱いについては記事全体を参照してください。あなたの2番目の質問については

:「リサイズするためのケースである(独自のメモリ割り当てを管理するためのベクトルの責任ですので、はい、tom[4].chuck.resize(5);によって割り当てられたメモリは(だけでなく解放されます) ")

+0

ああ、有名なcpp FAQ、私は_that_を考えていませんでした。あなた方全員に感謝します。これは本当に役に立ちました。これについて考えると、サイズを変更してループで消去し、そのメモリ使用量が時間とともに増加するかどうかを確認することもできます。 –

1

回答:new演算子でオブジェクトを動的に割り当てていないため、手動で割り当てを解除する必要はありません。 これは自動的に実行されます。

コードに戻る:

6番目の要素を消去する場合は、tom.erase (tom.begin()+5)を使用します。

すべての要素を消去する場合は、tom.erase (tom.begin(),tom.end())を使用してください。

最初の3つの要素を消去するには、tom.erase (tom.begin(),tom.begin()+3)を使用します。

#include <string> 
#include <vector> 
using namespace std; 

struct ding_t 
{ 
    std::string dang; 
} foo; 

struct boom_t { 
    std::vector <ding_t> chuck; 
} bar; 

int main() { 
    vector <boom_t> tom; 
    tom.resize(10); 
    tom[4].chuck.resize(5); 
    tom[4].chuck[3].dang = "jerry"; 

    //error C2661: 'erase' : no overloaded function takes 0 parameters 
    //tom.erase(); 

    // erase the 6th element 
    tom.erase (tom.begin()+5); 

    // erase the first 3 elements: 
    //tom.erase (tom.begin(),tom.begin()+3); 

    // erase everything: 
    //tom.erase (tom.begin(),tom.end()); 

    return 0; 
} 
0

さて、私はこの小さなチェックをしました。 (なぜ私はこれを早く考えなかったのか...昨日はかなり遅かった...)初期のコードはひどく書かれていて動作しませんでした。

これ:

#include <string> 
#include <vector> 

struct ding_t { 
    std::string dang; 
} foo; 

struct boom_t { 
    std::vector <ding_t> chuck; 
} bar; 

int main() { 
    std::vector <boom_t> tom; 

    while (true) { 
     tom.resize(10); 
     tom[4].chuck.resize(5); 
     tom[4].chuck[3].dang = "jerry"; 
     tom.erase(tom.begin(), tom.end()); 
    } 

    return 0; 
} 

メモリを引き起こさないで使用するメモリが安定している、リーク。

関連する問題