C ++“访问冲突读取位置”错误

时间:2013-04-14 02:12:48

标签: c++

我在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;

2 个答案:

答案 0 :(得分:7)

您尚未发布findvertex方法,但使用0x00000048之类的偏移量进行读取违规操作意味着您的getCost函数中的Vertex* f;正在接收null,并且在尝试访问时adj顶点指针(即null)中的成员f,它偏移到adj(在这种情况下,72字节(十进制0x48字节) ),它在0null内存地址附近读取。

执行这样的读取会违反受操作系统保护的内存,更重要的是,无论您指向的是什么都不是有效的指针。确保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}}

导致访问冲突。