当我用c ++擦除我的向量时遇到双重自由错误

时间:2016-05-12 05:34:29

标签: c++ vector std erase double-free

如下面的代码。

我想将向量中的元素移回。

  

例如:     [(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++;
    }

}

1 个答案:

答案 0 :(得分:3)

push_back调用erasestd::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()); } ,因此您可以更简单地编写

html {
    background: #ffffff;
}