当我在 C++ 中擦除我的向量时,我遇到了双重错误
I meets double free error when I erase my vector in c++
如下代码。
我想把向量中的元素移到后面。
eg:
[(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++;
}
}
调用 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());
}
如下代码。
我想把向量中的元素移到后面。
eg: [(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++;
}
}
调用 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());
}