7

我在一个类中有以下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;
4

2 回答 2

12

您还没有发布该findvertex方法,但是带有偏移量的访问读取冲突0x00000048意味着Vertex* f;您的 getCost 函数中的 正在接收 null,并且当尝试访问Vertex 指针adj中的成员null(即 in f)时,它会偏移到adj(在这种情况下,72 字节(十进制的 0x48 字节)),它在0null内存地址附近读取。

像这样进行读取违反了受操作系统保护的内存,更重要的是,这意味着您指向的任何内容都不是有效的指针。确保findvertex没有返回 null,或者f在使用它之前对 null 进行比较以保持自己的理智(或使用断言):

assert( f != null ); // A good sanity check

编辑:

如果你有一个mapfor 做类似查找的事情,你可以使用地图的find方法来确保顶点存在:

Vertex* Graph::findvertex(string s)
{
    vmap::iterator itr = map1.find( s );
    if ( itr == map1.end() )
    {
        return NULL;
    }
    return itr->second;
}

只要确保你仍然小心处理它返回的错误情况NULL。否则,您将不断收到此访问冲突。

于 2013-04-14T02:20:58.480 回答
2
Vertex *f=(findvertex(from));
if(!f) {
    cerr << "vertex not found" << endl;
    exit(1) // or return;
}

因为如果找不到顶点findVertex可以返回。NULL

否则这f->adj;是试图做的

NULL->adj;

这会导致访问冲突。

于 2013-04-14T02:20:03.117 回答