Есть ли вероятность утечки памяти?
Да, существует большая вероятность утечки памяти.
Если есть утечка памяти, как мы можем решить эту проблему?
Как правило, это можно решить путем реализации деструктора. Опять же, согласно правилу из трех , нам также потребуется конструктор копирования , на тот случай, если конечный пользователь решит скопировать один список в другой.
Но на самом деле мы могли бы обойти это, если бы не выделялся динамически во-первых! Давайте переопределим с помощью std::vector
:
class Graph
{
int V;
vector<list<int>> adj;
public:
Graph(int V);
// ...
};
Graph::Graph(int V)
{
this->V = V;
adj.assign(V, list<int>()); // std::vector::assign
}
void Graph::BFS(int s)
{
// Mark all the vertices as not visited
vector<bool> visited(V); // see note below *
for(int i = 0; i < V; i++)
visited[i] = false;
// Create a queue for BFS
list<int> queue;
// Mark the current node as visited and enqueue it
visited[s] = true;
queue.push_back(s);
// 'i' will be used to get all adjacent
// vertices of a vertex
list<int>::iterator i;
while(!queue.empty())
{
// Dequeue a vertex from queue and print it
s = queue.front();
cout << s << " ";
queue.pop_front();
// Get all adjacent vertices of the dequeued
// vertex s. If a adjacent has not been visited,
// then mark it visited and enqueue it
for (i = adj[s].begin(); i != adj[s].end(); ++i)
{
if (!visited[*i])
{
visited[*i] = true;
queue.push_back(*i);
}
}
}
}
Существует множество других мелких проблем с этим кодом, но я оставлю это в качестве упражнения для читателя.
* Примечание: vector<bool>
не ваш нормальный вектор.