2016-05-12 10 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 ***

Это фрагмент кода:

#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

Вызов push_back или erase к std::vector может привести к аннулированию итераторы. Легче использовать индексы.

#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++; 
    } 

} 

Поскольку 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

Спасибо за ваш ответ. Но одно я не понимаю. Вы говорите, что 'Invoking push_back или erase to std :: vector может аннулировать итераторы. '. Но я пытаюсь удалить 'push_back' или' erase'. Оно работает. Не могли бы вы сказать, почему эти две линии не могут существовать одновременно? –

+1

@ Шаун Хуан читает документацию ['pushback'] (http://en.cppreference.com/w/cpp/container/vector/push_back) и [' erase'] (http://en.cppreference.com/w/cpp/container/vector/erase) может помочь. –

+0

@bkVnet спасибо. Я буду проверять больше случаев, когда итератор недействителен. –