Ошибка сегмента с помощью Boost :: Heap Handle

Новый (плохой) C ++ программист здесь (поэтому, пожалуйста, не обращайте внимания на все несущественные ошибки / упрощения для удобства чтения):

У меня постоянные проблемы при использовании маркеров Boost :: heap. Обычно я либо сегментирую ошибку, либо попадаю в состояние, которое не имеет смысла (что в итоге вызывает ошибку сегмента). По сути, у меня есть вектор карт. Я отображаю целые числа (индексы) на дескрипторы EdgeStructs. Сначала я заполняю кучу EdgeStructs. Куча основана на EdgeStruct.value.

typedef boost::heap::binomial_heap<EdgeStruct*>::handle_type handle_t;
std::vector<std::map<int,handle_t> > indexToIndex;
boost::heap::binomial_heap<EdgeStruct*> heap;

void class::populateStructures(void) {
while (populating data structures) {
...
EdgeStruct* q = new EdgeStruct;
q->value = -error;
q->index1 = index1;
q->index2 = index2;
q->alive = true;
handle_t handyq = heap.push(q);
indexToIndex[index1][index2] = handyq;
indexToIndex[index2][index1] = handyq;
}
}

Затем я перебираю кучу, выскакивая структуры, пока иду вперед.

void class::iterateOverHeap(void) {
populateStructures();
while (!heap.empty()) {
this->bestEdgeStruct = heap.top();
if (this->bestEdgeStruct->alive)
destroyIndices(this->bestEdgeStruct->index1, this->bestEdgeStruct->index2);
heap.pop();
}
}

В destroyIndices () я обновляю значения этих структур в куче в какой-то другой функции:

void class::someOtherFunction(void) {
map<int,handle_t>::iterator iter;
...
for (iterating using iter) {
(*(iter->second))->value = error;
heap.update(iter->second);
}
}

Я также добавляю новые структуры в кучу и новые маркеры к этим структурам как на старых, так и на новых картах в indexToIndex в определенных точках. Никаких реальных проблем пока нет. Но я также хочу стереть некоторые структуры, которые полностью становятся недействительными из кучи во время destroyIndices (). Что я делаю, так это нахожу определенные структуры, перебирая определенные карты indexToIndex, удаляя их дескрипторы из этих карт, а затем устанавливая структуру, на которую указывает дескриптор, в состояние dead, чтобы destroyIndices () в iterateOverHeap () не вызывался для него, и он вместо этого выскочил и забыл. Я также вызываю эту функцию в destroyIndices ():

void class::killStructInMapsAndHeap(int index, int otherIndex) {
map<int,handle_t>::iterator it;
map<int,handle_t>::iterator otherIt;

it = indexToIndex[index].begin();
while (it != indexToIndex[index].end()) {
otherIt = indexToIndex[it->first].find(index);
handle_t handle = it->second;

if (*handle != bestEdgeStruct) {
cout << "Seg faults can happen here\n";
(*handle)->alive = false;
cout << "Or here\n";
heap.update(handle);
}

if (otherIt != indexToIndex[it->first].end()) {
indexToIndex[it->first].erase(otherIt);
} else {
cout << "Problem!"}

indexToIndex[index].erase(it++);
}
}

Я в значительной степени обнаруживаю ошибки в очередях за койками каждый раз. Я пробовал другие вещи (например, прямое стирание дескриптора вместо ожидания извлечения его из кучи), но у них была та же проблема.

На основании документации здесь, кажется, что не должно быть проблем с сохранением дескрипторов в векторе и последующей итерацией по ним и обновлением соответствующих структур, даже если я обновил или добавил другие структуры в кучу. Но после (несколько) случайного числа циклов в iterateOverHeap (), либо обращение к структуре, на которую указывает дескриптор, либо обновление этого дескриптора в куче, вызывает ошибку сегмента.

Означает ли это, что я не могу хранить маркеры в векторе, потому что через некоторое время они становятся недействительными? Или есть какая-то ошибка, которая, даже после переписывания некоторых из этих функций по-разному, делает мои дескрипторы недействительными? Или, может быть, когда я запускаю populateStructures (), я не получаю правильно дескриптор EdgeStruct?

Один из способов, которым я «решил» это — никогда не обновлять кучу, а вместо этого очищать ее и заново заполнять ее каждый раз, когда я изменяю свои структуры данных. Но это может стать чрезвычайно медленным, так как размер моих данных увеличивается (более 100 000 элементов), поэтому это нецелесообразно. Спасибо за вашу помощь (и дайте мне знать, как я могу сделать этот вопрос лучше)!

0

Решение

Задача ещё не решена.

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

Других решений пока нет …

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