我有一个类型为<的向量Vertex *> *,以及Vertex *类型的变量k。当我试图在这个向量v中推回k时,有一个段错误(核心转储)。知道是什么原因引起的吗?这是代码,如果有帮助的话。
我的代码基本上是一个BFS图搜索,用于查找2个顶点之间的最短路径。
queue<Vertex*> myqueue;
unordered_map<Vertex*,Vertex*> mymap;
std::vector<Vertex*>* v;
//std::vector<Vertex*>* d;
Vertex* k;
Vertex* f;
Vertex* l;
//here I will store the visited vertices(ones that've been put into the queue.) as well as the the previous nodes of this unordered map.
if(!containsVertex(v1)||!containsVertex(v2))
{
cout<<"The vertices you wish to find the shortest path between, don't exist. You might want to check them."<<endl;
return NULL;
}
myqueue.push(v1);
mymap[v1]=NULL;
cout<<"Pushed v1"<<endl;
while(!myqueue.empty())
{
cout<<"Entered while loop"<<endl;
f=myqueue.front();
myqueue.pop();
cout<<"executed popping"<<endl;
for(int i=0;i<neighbors(f).size();i++)
{
cout<<"entered for loop"<<endl;
if(neighbors(f).at(i)==v2)
{
cout<<"found the guy. Preparing to output the vector"<<endl;
k=v2;
mymap[v2]=f;
cout<<"Is the fault here?"<<endl;
while(mymap[k]!=v1)
{
cout<<"Entered the while loop"<<endl;
v->push_back(k);
cout<<"After the pushback?"<<endl;
cout<<v->size()<<endl;
cout<<"After outputting the size?"<<endl;
l=mymap[k];
cout<<"After the mapping retrieval?"<<endl;
k=l;
cout<<"after the end assignment?"<<endl;
}
cout<<"Exited the while loop"<<endl;
v->push_back(v1);
return v;
}
if(mymap.find(neighbors(f).at(i))==mymap.end())
{
myqueue.push(neighbors(f).at(i));
mymap[neighbors(f).at(i)]=f;
}
}
}
cout<<"There doesn't exist a shortest path between these two vertices."<<endl;
return NULL;
在我尝试开始推动向量中的元素的部分期间出现seg错误。
答案 0 :(得分:2)
在您的代码中,您有:
std::vector<Vertex*>* v;
// bunch of lines that don't reference v
v->push_back(k);
v
在任何时候都没有指向实际的对象。你需要一个实际的矢量push_back。之一:
std::vector<Vertex*>* v = new std::vector<Vertex*>;
// remember to delete it
或者,你真的需要指针吗?
std::vector<Vertex*> v;
// bunch of lines
v.push_back(k);
答案 1 :(得分:1)
你永远不会分配v
,它是指向堆上的指针(指针......)的指针。这就是为什么你要分裂。
在使用v之前,添加类似的内容可以解决您的问题:
v = new std::vector<Vertex*>;
除了这个错误之外,您可能需要考虑逐步完成设计并确定此类数据结构是否有意义。正如其他人所指出的那样,MCVE例子可以让我们更好地理解你想要做的事情。
也就是说,定义一个包含原始指针的向量的原始指针可能不是你想要做的。无需努力查看代码,将v更改为本地范围(在堆栈上)向量可能适用于任务
std::vector<Vertex*> v;
(然后将所有v->
更改为v.