課題のコードを書いているときに、1 つの奇妙な動作に固執してしまいました。コードは大きいので、不要ですが掲載しません。
ベクトルからオブジェクトを削除しようとしたときに、セグメンテーション違反が発生しました。自分でデバッグしようとしているときに、次のことがわかりました。
次のスニペットを使用してコードを実行すると、ベクターが空になり、2 行目でセグメンテーション違反が発生します (ベクターが空であるため)。
cout << this->adjacencyList.empty() << endl; // yeah, I'm working with graph
cout << *(this->adjacencyList[0]) << endl; // list has pointers
ただし、2行目を削除すると、ベクターが空ではないことが示され、次に進みます。空ベクトルのガードはそれを保持できず、セグメンテーション違反が発生します。
この行動について何か考えはありますか?ポイントがまだ曖昧な場合は、編集として完全なコードを投稿できます。
前もって感謝します。
編集:
「もう少し」とおっしゃっていた方へ。
void Node :: removeEdge (string destination) // removes an edge; edge is a class that contains a pointer to another node and its weight
{
bool deleted = false;
cout << *this << endl; // output stream operator is overloaded for node class and is working properly - shows it's label and edges - no error for an edge
cout << this->adjacencyList.empty() << endl;
// cout << *(this->adjacencyList[0]) << endl; // output stream operator is overloaded for edge class - error for an edge
if (!this->adjacencyList.empty())
{
for (vector <Edge *> :: iterator itr = this->adjacencyList.begin(); itr != this->adjacencyList.end(); ++itr)
{
if (((*itr)->getAdjacent())->getLabel() == destination) // segfault here
{
Edge *temp = *itr;
this->adjacencyList.erase (itr);
delete temp;
deleted = true;
}
}
}
if (!deleted)
throw EDGE_DOES_NOT_EXIST; // one of exceptions declared in enum somewhere in my code
}
2番目の編集:
注: ヘッダーは変更できません (アシスタントから提供されたものです)。変更を求めないでください。
完全なコードに興味がある場合は、ここで見つけることができます
http://pastebin.com/iCYF6hdP - Exceptions.h - すべての例外
http://pastebin.com/1fcgHGDa - Edge.h - エッジ クラス宣言
http://pastebin.com/C2DD6e3D - Edge.cpp - エッジ クラスの実装
http://pastebin.com/ZNqQ1iHE - Node.h - ノード クラス宣言
http://pastebin.com/kaVtZ3SH - Node.cpp - ノード クラスの実装
http://pastebin.com/A7Fwsi4m - Network.h - グラフ クラスの宣言
http://pastebin.com/02LX0rjw - Network.cpp - グラフ クラスの実装
http://pastebin.com/MRMn0Scz - main.cpp - サンプル メイン