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::vector
にpush_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++;
}
}
感謝を記述することができるときを除いてインクリメントする以外には使用されません。しかし、私は理解していない1つのこと。あなたは '' push_backを呼び出すかstd :: vectorに消去するとイテレータを無効にするかもしれないと言っています。しかし、私は 'push_back'または' erase'を取り除こうとします。できます。なぜこの2つのラインが同時に存在しないのか教えてください。 –
@Shawn Huangは['pushback'](http://en.cppreference.com/w/cpp/container/vector/push_back)と[' erase'](http://en.cppreference.com)のドキュメントを読んでいます。/w/cpp/container/vector/erase)が役立つ可能性があります。 –
@bkVnetありがとう。イテレータが無効になったときに、より多くのケースをテストします。 –