我有一个优先级队列,其中包含一个名为A的类的元素。我需要来自此队列的元素,这些元素可能位于队列的下方(lesses priority)。所以,我试图弹出一些元素,直到我得到我选择的元素。一旦我得到我选择的元素,我计划将我临时存储的所有元素推送到数组中。我有一个循环,并且每次迭代我都会进一步排队,检查我弹出的元素是否是我选择的。这样我在临时数组中有更多数据。当我尝试将此临时数组中的数据推回到优先级队列时,会出现问题。优先级的底层容器是一个向量,调试显示问题在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++
}
答案 0 :(得分:1)
如果A是非POD,那么使用malloc可能会导致各种问题。改为使用向量:
std::vector<A> temp_array(count);
免费将完全消失。
答案 1 :(得分:1)
您的malloc行分配一个足够大的数组来保存count
类型的A
个对象,但实际上并不创建任何对象。当您尝试使用不存在的对象时,会发生未定义的行为(例如,段错误)。
尝试用std::vector<A> temp_array(count)
替换malloc。这将给你(有效)一组count
默认构造的A
对象。更重要的是,当它超出范围时,它将自行释放。