向量传递给函数作为参考 - 双释放或损坏

问题描述 投票:0回答:1

在我的程序中,在类构造函数中,我正在创建一个名为“pos”的无符号整数向量,稍后使用另一个函数对其进行修改,并通过引用传递到该函数。

FockStates(int N=0, int m=0, ParticleType type=boson)
{
    
    states.clear();
    if(m>0 && N>=m)
    {
        
        std::vector<unsigned int> pos(m,0);//vector which gets corrupted
        
        if(type==fermion)
        {
            for(int i=0;i<m;i++)
            {
                pos[i]=i;
            }
        }
        
        bool success=true;
        
        while(success)
        {
            
            states.push_back(PosToState(pos,N,m));
            
            success=nextState(pos,N,m,type);//removing this function yields no error
        }
        
    }//exact moment of "double free or corrupted"
}

构建完成后,我收到运行时错误“双重释放或损坏”。我知道这与“pos”相关,因为这种情况要么发生在创建它的“if”的精确末尾,要么当我将声明移到 if 之外时,发生在函数的精确末尾,所以可能当向量是被释放了(这是有道理的)。

我还注意到,当我删除“nextState”函数的使用时,问题就停止了,该函数将“pos”作为参考并修改它。

这是“nextState”函数:

bool nextState(std::vector<unsigned int> &pos, int N=0, int m=0, ParticleType type=boson)// removing this function yields no error
{
    int i=m-1;
    pos[i]+=1;
    while(true)
    {
        std::cout<<i<<"\n";
        if(i<0)
            return false;
        if(int(pos[i])>=N+type*(i-m+1))
        {
            
            pos[i-1]+=1;
            for(int j=i;j<m;j++)
            {
                pos[j]=pos[j-1]+type;
            }
            i-=1;
        }
        else
            break;
        
    }
    return true;
}

程序是否有可能尝试“清理”通过引用传递的向量?

我该如何解决这个问题?

c++ memory vector reference double-free
1个回答
0
投票

好吧,我发现了一个错误,它与“释放空间”无关。 事实上,我有时会要求负索引。

随着数组中的内容变得更加完整,我正在向后移动索引。我有“if”,当我达到负数时,它会停止一切,但随后我使用索引 i-1。 i 等于 0,所以 i-1 为负。

解决方案是将 if 移至负数,并实际搜索零。

bool nextState(std::vector<unsigned int> &pos, int N=0, int m=0, ParticleType type=boson)// removing this function yields no error
{
    int i=m-1;
    pos.at(i)+=1;
    while(true)
    {
        std::cout<<i<<"\n";
        if(int(pos.at(i))>=N+type*(i-m+1))
        {
            if(i==0) return false;
            pos.at(i-1)+=1;//outside of check - index i is 0, but I modify i-1, so index -1.
            for(int j=i;j<m;j++)
            {
                pos.at(j)=pos.at(j-1)+type;
            }
            i-=1;
            //return false;
        }
        else
            break;
        
    }
    return true;
}
© www.soinside.com 2019 - 2024. All rights reserved.