При написании кода для моего задания я столкнулся с одним странным поведением. Код большой, поэтому, в то время как он не нужен, я не буду публиковать его.C++: поведение странного вектора
Дело в том, что я пытался удалить объект из вектора, у меня была ошибка сегментации. При попытке самостоятельно отладить его, я нашел следующее:
Если я выполняю свой код со следующим фрагментом, у меня есть пустой вектор, а затем ошибка сегментации на второй строке (поскольку вектор пуст).
cout << this->adjacencyList.empty() << endl; // yeah, I'm working with graph
cout << *(this->adjacencyList[0]) << endl; // list has pointers
Однако, когда я удаляю вторую строку, это показывает, что вектор не пуст, а затем продолжается. Охранник для пустых векторов не может удерживать его, и возникает ошибка сегментации.
У вас есть идеи по этому вопросу? Если точка остается неопределенной, я могу опубликовать свой полный код в качестве редактирования.
Заранее спасибо.
EDIT:
Для того, кто спрашивал "немного больше".
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
}
ВТОРОЙ EDIT:
Примечание: Я не могу изменить заголовки (они были поставлены помощниками), так что не спрашивайте меня изменить.
Если вы заинтересованы в полном коде, вы можете найти здесь
http://pastebin.com/iCYF6hdP - Exceptions.h - все исключения
http://pastebin.com/1fcgHGDa - edge.h - край объявление класса
http://pastebin.com/C2DD6e3D - Край. 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 - образец Основной
Что такое декларация 'adjacencyList'? –
adjacencyList() - это функция, а не вектор. Пока никто не знает, что эта функция на самом деле делает с вашим вектором, трудно сказать ... – Pixelchemist
@Joachim Pileborg, может быть, есть какая-то операционная перегрузка для << –