我在Vertex
类中有以下Graph
结构:
struct Vertex
{
string country;
string city;
double lon;
double lat;
vector<edge> *adj;
Vertex(string country, string city, double lon, double lat)
{
this->country = country;
this->city = city;
this->lon = lon;
this->lat = lat;
this->adj = new vector<edge>();
}
};
当我调用我编写的名为getCost()
的方法时,我会继续获得相同的未处理异常
访问冲突读取位置0x00000048
我无法弄明白为什么。
getCost()
方法:
void Graph::getCost(string from, string to)
{
Vertex *f = (findvertex(from));
vector<edge> *v = f->adj; // Here is where it gives the error
vector<edge>::iterator itr = v->begin();
for (; itr != v->end(); itr++)
{
if (((*itr).dest)->city == to)
cout << "\nCost:-" << (*itr).cost;
}
}
方法findvertex()
返回类型Vertex*
的值。为什么我一直收到这个错误?
findVertex方法:
Vertex* Graph::findvertex(string s)
{
vmap::iterator itr = map1.begin();
while (itr != map1.end())
{
if (itr->first == s){
return itr->second;
}
itr++;
}
return NULL;
}
定义map1
的位置:
typedef map< string, Vertex *, less<string> > vmap;
vmap map1;
答案 0 :(得分:7)
您尚未发布findvertex
方法,但使用0x00000048
之类的偏移量进行读取违规操作意味着您的getCost函数中的Vertex* f;
正在接收null,并且在尝试访问时adj
顶点指针(即null
)中的成员f
,它偏移到adj
(在这种情况下,72字节(十进制0x48字节) ),它在0
或null
内存地址附近读取。
执行这样的读取会违反受操作系统保护的内存,更重要的是,无论您指向的是什么都不是有效的指针。确保findvertex
没有返回null,或者在f
上对null进行比较,然后再使用它来保持自己的理智(或使用断言):
assert( f != null ); // A good sanity check
修改强>
如果你有一个map
来做类似于查找的事情,你可以使用地图的find
方法来确保顶点存在:
Vertex* Graph::findvertex(string s)
{
vmap::iterator itr = map1.find( s );
if ( itr == map1.end() )
{
return NULL;
}
return itr->second;
}
请确保您仍然小心处理返回NULL
的错误情况。否则,您将继续遭受此访问冲突。
答案 1 :(得分:2)
Vertex *f=(findvertex(from));
if(!f) {
cerr << "vertex not found" << endl;
exit(1) // or return;
}
如果findVertex
找不到顶点,NULL
可以返回f->adj;
。
否则此NULL->adj;
正在尝试
{{1}}
导致访问冲突。