Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与“碰撞”;检测到glibc:矢量双自由或损坏(输出)“;_C++_Vector_Crash_Glibc - Fatal编程技术网

C++ 与“碰撞”;检测到glibc:矢量双自由或损坏(输出)“;

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>

我正在实现一个整数的置换函数。它的运行时错误为 “矢量双自由或损坏(输出)”

使用gdb,在逐步调用之后,它会在迭代完成后崩溃

但我真的很难找到问题所在

#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,但这样做是一个错误。