向量构造函数中的段错误
segfault in vector constructor
我有一个极简的交通模拟器:它是元胞自动机,分四个步骤工作:
- 加速(+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(这可能会重新分配向量缓冲区),这些指针在道路不再有效,不确定这是否是你的问题的确切原因
相关文章:
- 为什么PyImport_ImportModule python 3.7.2 中出现段错误?
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- 全局向量导致 C++ 程序结束时出现段错误
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 更改条件段错误
- 使用 TTF_RenderText() 加载字体时获取段错误 TTF_OpenFontRW()
- 注册对对象工厂的调用会导致段错误
- pthread_create在构造函数段错误中
- Nanoflann发现邻居提出段错误
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 具有unique_ptr的 CRTP 会导致段错误
- 增强纤维work_stealing屏障会导致段错误
- 当我返回指向结构的指针向量时出现段错误
- C++为什么我的代码没有爆炸/段错误?
- Pthread段错误,使用指向main中变量的指针
- C++ 模板中的段错误
- 相当于Windows/MSVC上的段错误?
- 为什么我的 LLVM JIT 实现出现段错误?
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?