在我的程序中,在类构造函数中,我正在创建一个名为“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;
}
程序是否有可能尝试“清理”通过引用传递的向量?
我该如何解决这个问题?
好吧,我发现了一个错误,它与“释放空间”无关。 事实上,我有时会要求负索引。
随着数组中的内容变得更加完整,我正在向后移动索引。我有“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;
}