Неиспользуемое исключение из-за неправильного использования указателя

это мой первый вопрос, поэтому я прошу прощения за возможные формальные ошибки, которые вы можете найти в моем посте.

Я пишу простой класс для «Ненаправленных связанных взвешенных графов», который должен использовать списки смежности, основанные на векторах.

Проблема в том, что когда я запускаю программу из 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;
}

0

Решение

Я заметил пару ошибок в коде:

  1. Если вам нужны списки смежности, то this->adj должен быть вектором векторов. В настоящее время это просто 1-D вектор <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, вес) вместо (вес, вес) в этот вектор. Модифицированная функция 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);
    }
    

Надеюсь, это поможет вам

1

Другие решения


По вопросам рекламы [email protected]