Я сталкиваюсь с двойной свободной ошибкой, когда я стираю свой вектор в переполнении стека

Как следующий код.

Я хочу переместить элемент вектора назад.

например:
[(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++;
}

}

0

Решение

Вызов 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());

}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]