矢量构造函数中的段错误

时间:2014-03-27 09:43:49

标签: c++ vector constructor

我有一个极简主义的交通模拟器:它是细胞自动机,分为四个步骤:

  • 加速度(+1单位速度)
  • 制动安全性( - 到下一辆车的空单元数)
  • 随机破解,模拟驱动程序的不完美(-1或-0随机),
  • mooving(+车厢速度+)

我在移动过程中得到了一个Segfault,在vector<vehicule*>的初始化期间,它没有进入向量的构造函数。 但是当删除破坏安全程序时,我没有任何段错误。如果道路的大小低于16,我没有人。

这是获取错误的最小代码

#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ée\n";
    }

}

/// --------------------------------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 v\tincrémenter le nombre de vehicules\n quit\tquiter la simulation.\n";
        cin>>commande;

        if(commande=="v")
        {
            add_veicule(ensembleV, road);

        }

        if(commande=="quit")
        {
            continuer=false;
        }


    }

    return 0;
}

我把道路和ensembleV放到了全球空间,segfault仍然存在。

2 个答案:

答案 0 :(得分:1)

此:

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

应该是:

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

好像你的编译器欺骗了你...其余的它对我有用,没有错误,或者甚至在nbV = 1

崩溃

答案 1 :(得分:0)

IMO问题在于这个循环:

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

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

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

另外,你将你的道路矢量指针放入ensembleV元素:

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

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