由于指针使用不当而导致的未上线异常

Unhlandled exception due to bad pointer usage

本文关键字:异常 上线 使用不当 于指针 指针      更新时间:2023-10-16

这是我在这里的第一个问题,所以我为你可能在我的帖子中发现的最终正式错误道歉。

我正在为"无向连接加权图"编写一个简单的类,该类必须使用基于向量的邻接列表。

问题是,当我从 Eclipse 运行该程序时,MS Windows 说它"停止工作",调试后我得到一个"0x00AE251A未处理的异常......访问违规写入位置..."消息。环顾四周,我发现此问题可能是由缺少指针销毁或指针初始化(?)引起的。我从标准指针切换到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>对的 1-D 向量。相反,它应该是:

    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,权重)推入该向量[请注意,即使我们忽略只有向量的错误,逻辑仍然不正确,因为您将(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);
    }
    

希望这对你有帮助