向量构造函数中的段错误

segfault in vector constructor

本文关键字:错误 段错误 构造函数 向量      更新时间:2023-10-16

我有一个极简的交通模拟器:它是元胞自动机,分四个步骤工作:

  • 加速(+1单位速度)
  • 制动安全性(-空车格数)
  • 随机断路,模拟驱动程序的缺陷(-1或-0随机),
  • 移动(+汽车单元的速度)

我在移动过程中得到一个段故障,在vector<vehicule*>的初始化期间,它没有进入向量的构造函数。但是当拆除了断裂安全程序后,我没有任何分段故障。如果道路的宽度小于16,我就没有人了。

下面是获得bug的最小代码

#include <iostream>
#include <vector>
using namespace std;
struct vehicule
{
    vehicule(int v);
    int vitesse;//speed
    static int vMax;
};
vehicule::vehicule(int v)
{   vitesse=v;  }
int vehicule::vMax=5;

void avancer(std::vector<vehicule*>&);//each car mooves their value of speed, of square on the road.
void freinage_secu(std::vector<vehicule*>& );//each car slow down the number of cases betwen their and the next car. 
void add_veicule(std::vector<vehicule>&, std::vector<vehicule*>& );
void afficher_route(std::vector<vehicule*>& road)
{
    for (vehicule* v:road)
    {
        if (v==nullptr)
        {   cout<<"-";  }
        else
        {   cout<<"x";  }
    }
    cout<<"n";
}


void freinage_secu(vector<vehicule*> &road)
{
    int lng=road.size();
    int nbV=0;
    int last;
    int j=0;
    for (unsigned int i=0;i<road.size();i++)//compter le nombres de vehicules
    {
        if(road[i]!=nullptr)
        {
            nbV++;
        }
    }
    while(road[(j%lng)]==nullptr)//on se place sur le premier evicule
    {   j++;    }
    for (int i=0;i<nbV;i++)
    {
        last=j;
        do
        {
            j++;
        }while(road[j%lng]==nullptr);
        if(road[last]->vitesse>(j+lng-last-1)%lng)
        {
            road[last]->vitesse=(j+lng-last-1)%lng;
        }
    }
}


void avancer(vector<vehicule*> &road)
{
    vector<vehicule*> road2(road.size(),nullptr);//<<<--the bug comme there
    for (unsigned int i=0;i<road.size();i++)
    {
        if (road[i]!=nullptr)
        {
            road2[(i+road[i]->vitesse)%road.size()]=road[i];
        }
    }
    road=road2;
}


void add_veicule(vector<vehicule> &V, std::vector<vehicule*>& road)
{
    unsigned int i=0;
    bool overload=1;
    V.push_back(vehicule::vMax-vehicule::vMax/2);
    while(road[i]!=nullptr&& i<road.size())
    {
        i++;
    }
    if (i<road.size())
    {
        road[i]=&V[V.size()-1];
        overload=0;
    }
    if (overload)
    {
        V.pop_back();
        cout<<"la route est saturéen";
    }
}
/// --------------------------------main
int main()
{
    int nbV=16;//dont'bugs if it is lower than 16 (we can overload the road), bugs if <= 16
    vector<vehicule> ensembleV;
    vector<vehicule*> road(nbV,NULL);//the road is a ring.
    string commande;
    bool continuer=true;
    add_veicule(ensembleV, road);

    while(continuer)
    {
        freinage_secu(road);//slow down 
        avancer(road);//move foward
        afficher_route(road);
        cout<<"que voulez vous faire ?n vtincrémenter le nombre de vehiculesn quittquiter la simulation.n";
        cin>>commande;
        if(commande=="v")
        {
            add_veicule(ensembleV, road);
        }
        if(commande=="quit")
        {
            continuer=false;
        }

    }
    return 0;
}

我把road和ensembleV放到全局空间,段断层仍然存在

This:

vector<vehicule*> road(nbV,NULL);//the road is a ring.
应:

vector<vehicule*> road(nbV, nullptr);//the road is a ring.

似乎你的编译器在欺骗你…在其余的工作,它为我,没有错误,或崩溃,甚至与nbV = 1

我的问题是这个循环:

while(road[i]!=nullptr && i<road.size())
{
    i++;
}

假设road的大小为1,并且元素非空,那么在第二次迭代时,您将首先检查road[1]是否在边界之外。将其更改为:

while(i<road.size() && road[i]!=nullptr)

同样,你把你的道路矢量指向ensembleV元素:

road[i]=&V[V.size()-1];

后,您调整大小的ensembleV的ie。Push_back(这可能会重新分配向量缓冲区),这些指针在道路不再有效,不确定这是否是你的问题的确切原因