2016-05-12 13 views
0

次のコードと同じです。ベクトルをC++で消去するとダブルフリーエラーが発生する

ベクトル内の要素を元に戻したいと考えています。

例: [(1)、2,3,4] - > [2,3,4、(1)]

しかし、それは二重の自由な問題を引き起こします。 このコードのロジックは単純です。

私は消去機能を誤用していると思います。 それは本当ですか?誰かが詳細を教えてくれる?

読んでいただきありがとうございます。

これが出力される。

*** Error in '/home/ubuntu/workspace/hello-cpp-world.cc.o': double free or corruption (out): 0x00000000016ffca0 ***

これは、コードスニペットである:std::vectorpush_back又はeraseを呼び出す

#include <iostream> 
#include <vector> 

int main() { 
    std::vector<int*> targets; 

    int* a = new int; 
    *a = 1; 
    int* b = new int; 
    *b = 2; 
    targets.push_back(a); 
    targets.push_back(b); 
    int i =0; 
    for (std::vector<int*>::iterator obj1 = targets.begin(); obj1 != targets.end(); i++) 
    { 
     if(i==0) 
     { 
      int* tmp = *obj1; 
      targets.push_back(tmp); 
      targets.erase(obj1); 
     } 
     else obj1++; 
    } 

} 

答えて

3

はイテレータを無効にしてもよいです。索引を使用する方が簡単です。 obj1以来

#include <iostream> 
#include <vector> 

int main() { 
    std::vector<int*> targets; 

    int* a = new int; 
    *a = 1; 
    int* b = new int; 
    *b = 2; 
    targets.push_back(a); 
    targets.push_back(b); 
    int i =0; 
    for(size_t obj1 = 0; obj1 < targets.size(); i++) 
    { 
     if(i==0) 
     { 
      int* tmp = targets[obj1]; 
      targets.push_back(tmp); 
      targets.erase(targets.begin() + obj1); 
     } 
     else obj1++; 
    } 

} 

i==0、あなたはあなたの答えのために、より簡単に

#include <iostream> 
#include <vector> 

int main() { 
    std::vector<int*> targets; 

    int* a = new int; 
    *a = 1; 
    int* b = new int; 
    *b = 2; 
    targets.push_back(a); 
    targets.push_back(b); 

    int* tmp = targets[0]; 
    targets.push_back(tmp); 
    targets.erase(targets.begin()); 

} 
+0

感謝を記述することができるときを除いてインクリメントする以外には使用されません。しかし、私は理解していない1つのこと。あなたは '' push_backを呼び出すかstd :: vectorに消去するとイテレータを無効にするかもしれないと言っています。しかし、私は 'push_back'または' erase'を取り除こうとします。できます。なぜこの2つのラインが同時に存在しないのか教えてください。 –

+1

@Shawn Huangは['pushback'](http://en.cppreference.com/w/cpp/container/vector/push_back)と[' erase'](http://en.cppreference.com)のドキュメントを読んでいます。/w/cpp/container/vector/erase)が役立つ可能性があります。 –

+0

@bkVnetありがとう。イテレータが無効になったときに、より多くのケースをテストします。 –

関連する問題