Ошибка сегментации при использовании очередей с приоритетом - PullRequest
0 голосов
/ 29 июля 2010

У меня есть очередь с приоритетами с элементами класса с именем AI, которым нужны элементы из этой очереди, которые могут быть ниже по очереди (уменьшает приоритет).Итак, я пытаюсь добавить несколько элементов, пока не получу элемент по своему выбору.Как только я получу элемент по своему выбору, я планирую поместить все элементы, которые я временно храню в массиве.У меня есть цикл, и для каждой итерации я иду дальше по очереди, чтобы проверить, является ли выбранный мной элемент выбранным мной.Таким образом, у меня есть больше данных во временном массиве.Проблемы возникают, когда я пытаюсь отправить данные из этого временного массива обратно в очередь с приоритетами.Базовым контейнером приоритета является вектор, и отладка показывает, что проблема в stl_queue.h со строкой std :: push_heap (c.begin (), c.end (), comp);(c - вектор)

Я знаю, что это может быть неправильный способ сделать это, и я, вероятно, должен использовать конструктор вместо malloc и иметь std: list вместо очереди приоритетов, но может кто-нибудь дать мне знатьчто здесь происходит?

while(count < length_of_queue) // Iterate over all elements of queue
{

  A* temp_array = (A *)malloc(count * sizeof(A));;
  for (int i = 0;i<count;i++) // remove count number of elements from queue
  {
      temp_array[i] = priority queue.top();
      priority queue.pop(); // free_list is the priority queue
  }

  A check_element = free_list.top(); // Check if (count+1)th elements satisfies our         
                                     // criteria   
  if (criteria_satisfied)
  {
    priority_queue.pop();
    //freeing the temp_array and pushing back all the elements from temp_array into 
    // priority_queue like done in the else condition
    return check_element;
   }
  else
  {

    for (int i = 0;i<count;i++) // Push back all the elements popped until now
    {
      priority_queue.push(temp_array[i]); // Offending line
    }
    free (temp_array);
  }
  count++
}

Ответы [ 2 ]

1 голос
/ 29 июля 2010

Ваша строка malloc выделяет массив, достаточно большой для размещения count объектов типа A, но фактически не создает никаких объектов. Неопределенное поведение возникает (например, segfault), когда вы пытаетесь использовать объекты, которые не существуют.

Попробуйте заменить ваш malloc на std::vector<A> temp_array(count). Это даст вам (эффективно) массив count построенных по умолчанию A объектов. Что еще более важно, он освободится, когда выйдет за рамки.

1 голос
/ 29 июля 2010

Если A не POD, то использование malloc может вызвать все виды проблем.Вместо этого используйте вектор:

std::vector<A> temp_array(count);

Свободные затем полностью исчезнут.

...