C++で有向グラフを実装しようとしています。ただし、RemoveEdge関数に問題があります。関数を呼び出し、ポインターに対してdelete演算子を使用し、ポインターをに設定した後nullptr
、関数のスコープ外でnullになりません。
問題を十分に明確に述べたかどうかはわかりませんが、コードが役立つかもしれません。
Graph.h
template<class TVertex, class TEdge, class TWeight>
class Graph
{
protected:
std::list<Vertex<TVertex, TEdge, TWeight>*>* _Vertices;
std::list<Edge<TVertex, TEdge, TWeight>*>* _Edges;
public:
Graph();
int TotalVertices();
int TotalEdges();
std::list<Vertex<TVertex, TEdge, TWeight>*>* Vertices();
std::list<Edge<TVertex, TEdge, TWeight>*>* Edges();
Vertex<TVertex, TEdge, TWeight>* FindVertex(const TVertex&);
Vertex<TVertex, TEdge, TWeight>* InsertVertex(const TVertex&);
void RemoveVertex(const TVertex&);
Edge<TVertex, TEdge, TWeight>* FindEdge(const TEdge&);
Edge<TVertex, TEdge, TWeight>* InsertEdge(const TVertex&, const TVertex&, const TEdge&, const TWeight&);
void RemoveEdge(const TEdge&);
};
Graph.FindEdge()
template<class TVertex, class TEdge, class TWeight>
Edge<TVertex, TEdge, TWeight>* Graph<TVertex, TEdge, TWeight>::FindEdge(const TEdge& label)
{
Edge<TVertex, TEdge, TWeight>* edge = nullptr;
std::list<Edge<TVertex, TEdge, TWeight>*>::iterator it;
for(it = this->_Edges->begin(); it != this->_Edges->end(); ++it)
{
if(label == (*it)->Label())
{
edge = *it;
break;
}
}
return edge;
}
Graph.RemoveEdge()
template<class TVertex, class TEdge, class TWeight>
void Graph<TVertex, TEdge, TWeight>::RemoveEdge(const TEdge& label)
{
Edge<TVertex, TEdge, TWeight>* edge = this->FindEdge(label);
if(edge == nullptr)
return;
this->_Edges->remove(edge);
edge->Source()->RemoveEdge(edge);
edge->Destination()->RemoveEdge(edge);
// Problem is here, why isn't this working like I think it should?
delete edge;
edge = nullptr;
}
Main.cpp
// created graph
// added vertices
// added edges
Edge<string, string, int>* e5 = graph->InsertEdge("Oshawa", "Toronto", "E5", 5);
graph->RemoveEdge("E5");
cout << ((e5 == nullptr) ? "null" : "not null") << endl; // this outputs not null
グラフからエッジを削除するとプログラムがクラッシュすることがわかりますが、何らかの理由でnot null
、RemoveEdge関数の実行後にプログラムが出力されます。なぜこれが発生しているのかわかりません。削除演算子を使用し、その後でポインターを明示的にnullにしました。私はここで何が間違っているのですか?
はい、確かにエッジが見つかりました。FindEdge関数は正しいエッジオブジェクトを見つけて適切なリストから削除しますが、削除演算子は私が望んでいることを実行していません。
助けに感謝します。前もって感謝します。