C++ 与“碰撞”;检测到glibc:矢量双自由或损坏(输出)“;
我正在实现一个整数的置换函数。它的运行时错误为 “矢量双自由或损坏(输出)” 使用gdb,在逐步调用之后,它会在迭代完成后崩溃 但我真的很难找到问题所在C++ 与“碰撞”;检测到glibc:矢量双自由或损坏(输出)“;,c++,vector,crash,glibc,C++,Vector,Crash,Glibc,我正在实现一个整数的置换函数。它的运行时错误为 “矢量双自由或损坏(输出)” 使用gdb,在逐步调用之后,它会在迭代完成后崩溃 但我真的很难找到问题所在 #include <vector> using namespace std; class Permute { public: vector<vector<int> > vv; // interface vector<vector<int>
#include <vector>
using namespace std;
class Permute {
public:
vector<vector<int> > vv;
// interface
vector<vector<int> > permute(vector<int> &num) {
vector<int> v(0);
doPermute(v, num);
return vv;
}
// recursive function to permute
void doPermute(vector<int> v, vector<int> &num) {
if(num.empty()) {
vv.push_back(v);
// on gdb, if next after the above one, it is fine,
// but crashes after the following next
} else {
for (int i = 0; i < num.size(); i++)
{
int toAdd = num[i];
vector<int> rest(num);
rest.erase(num.begin()+i);
vector<int> prefix(v);
prefix.push_back(toAdd);
doPermute(prefix, rest);
}
}
}
};
int main(){
Permute pInst;
// sample to test with {1}
vector<int> vt (1, 1);
pInst.permute(vt);
}
#包括
使用名称空间std;
类排列{
公众:
向量vv;
//接口
向量排列(向量和数量){
向量v(0);
doPermute(v,num);
返回vv;
}
//递归函数置换
void doPermute(向量v、向量和数值){
if(num.empty()){
vv.推回(v);
//在gdb上,如果上一个之后是下一个,就可以了,
//但是在接下来的几天之后崩溃了
}否则{
对于(int i=0;i
看看这一行:
rest.erase(num.begin()+i);
尝试使用适当的迭代器进行擦除
:
rest.erase(rest.begin()+i);
请看这一行:
rest.erase(num.begin()+i);
尝试使用适当的迭代器进行擦除
:
rest.erase(rest.begin()+i);
您使用的编译器版本是什么?gcc版本4.4.6 20120305(Red Hat 4.4.6-4)(gcc)可能与您使用的编译器版本重复?gcc版本4.4.6 20120305(Red Hat 4.4.6-4)(gcc)可能与伟大的lonut重复,这解决了崩溃!!但是这是stl中的一个bug还是一些陷阱呢?根据定义,
erase
删除了作为参数传递给它的迭代器所指向的元素。所以通常迭代器应该指向要从中删除的向量中的元素,而不是指向另一个向量中的元素。您不会得到编译错误,因为在本例中,类型匹配,两者都是std::vector::iterator
s,但这样做是一个错误。很好,lonut,这解决了崩溃问题!!但是这是stl中的一个bug还是一些陷阱呢?根据定义,erase
删除了作为参数传递给它的迭代器所指向的元素。所以通常迭代器应该指向要从中删除的向量中的元素,而不是指向另一个向量中的元素。您不会得到编译错误,因为在本例中,类型匹配,两者都是std::vector::iterator
s,但这样做是一个错误。