由于错误的指针使用导致未处理的异常

Unhlandled exception due to bad pointer usage

这是我的第一个问题,对于您可能在我的 post 中发现的最终形式错误,我深表歉意。

我正在为 "Undirected Connected Weighted Graphs" 编写一个简单的 class,它必须使用基于向量的邻接列表。

问题是,当我 运行 来自 Eclipse 的程序时,MS Windows 说它 "stops working" 并且在调试后我收到一条 "Unhandled exception at 0x00AE251A .... Access violation writing location..." 消息。 环顾四周,我发现这个问题可能是由丢失的指针破坏或指针初始化(?)引起的。我从标准指针切换到 shared_ptr 来解决这个问题,但错误是一样的...

谁能教教我这个?我找了将近一整天的时间都没有成功。

class UndirectedGraph
{
private:
    int V;                                  
    std::vector<std::shared_ptr<std::pair<int,int>>>* adj;    
public:
    UndirectedGraph(int V)
{
        this->V = V;
        this->adj = new std::vector<std::shared_ptr<std::pair<int,int>>>;
}

void addEdge(int v, int w, int weight)
{
    auto sp = std::make_shared<std::pair<int,int>>(std::make_pair(v,weight));
    adj[v].push_back(sp);
}

int main()
{
    UndirectedGraph G1(7);//Ok
    G1.addEdge(0,1,9);//Ok
    G1.addEdge(1,2,5);//Ok
    G1.addEdge(2,0,8);//EXCEPTION RAISED HERE (if line is commented all run fine)
    return 0;
}

我注意到代码中有几个错误:

  1. 如果你需要的是邻接表,那么this->adj应该是向量的向量。目前,它只是 <int,int> 对的一维向量。相反,它应该是:

    std::vector<std::vector<std::shared_ptr<std::pair<int,int>>>>* adj;

  2. 在构造函数中,this->adj应该初始化如下:

    this->adj = new std::vector<std::vector<std::shared_ptr<std::pair<int,int>>>>(V);

  3. 现在,在 addEdge 函数中,您需要首先访问对应于节点 'v' 的向量,然后,将对 (w, weight) 推入该向量[注意,即使我们忽略了只有矢量的错误,逻辑仍然不正确,因为你在推 (v, weight)而不是 (w, weight) 进入该向量]。修改后的 addEdge 函数将是这样的:

    void addEdge(int v, int w, int weight)
    {
        auto adjacencyList = adj->at(v);
        auto sp = std::make_shared<std::pair<int,int>>(std::make_pair(w,weight));
        adjacencyList.push_back(sp);
    }
    

希望对您有所帮助