我有一个创建PriorityQueue结构的任务,我遇到了这段代码的问题。当我在我的compilator上编译它时一切都很好,但我尝试将它提交给ideone并且我收到以下错误:
“glibc检测到*** ./prog:双重免费或腐败”。
我能够跟踪给我这个错误的部分,我发现造成崩溃的原因是我试图在我的类的析构函数中删除一个指针。问题是我不知道为什么我不能删除它。我不太了解指针,但我认为如果我使用new来分配内存,我必须在使用后删除它,我认为这就是我想要做的。这是我的代码:
struct PriorityQueue
{
LinkedList queue; LinkNode *it,*node;
int sz;
PriorityQueue(){
sz=0;
queue.head=NULL;
queue.tail=NULL;
it = NULL;
node=NULL;
}
~PriorityQueue(){
if(node != NULL) //this is causing the error.
delete [] node;
if(it != NULL)
delete [] it;
}
int size(){
return sz;
}
void enqueue(int x){
node = new LinkNode(x,NULL,NULL);
if(sz==0){
queue.insert_head(x);
sz++;
}
else{
if(x <= queue.head->value ){
queue.insert_head(x);
sz++;
}
else if( x>= queue.tail->value ){
queue.insert_tail(x);
sz++;
}
else{
it = queue.head;
for(int k=0;k<sz;k++){
if( (x>= it->value) && (x <= it->next->value) ){
node->next= it->next;
node->previous = it;
it->next->previous = node;
it->next = node;
sz++;
break;
}
it=it->next;
}
}
}
}
int dequeue_min(){
int min = queue.remove_head();
sz--;
return min;
}
int dequeue_max(){
int max= queue.remove_tail();
sz--;
return max;
}
};
int main()
{
PriorityQueue pq;
pq.enqueue(4);
pq.enqueue(2);
pq.enqueue(7);
pq.enqueue(-6);
pq.enqueue(0);
cout << pq.dequeue_min() << endl; // debe imprimir -6
cout << pq.dequeue_min() << endl; // debe imprimir 0
pq.enqueue(3);
cout << pq.dequeue_min() << endl; // debe imprimir 2
cout << pq.dequeue_min() << endl; // debe imprimir 3
return 0;
}
感谢。
答案 0 :(得分:3)
it
和node
指向对象,而不是数组
您不能在其上使用delete[]
的数组形式。
答案 1 :(得分:1)
使用delete []将尝试删除其对象是某种数组的指针。还有另一种类型的删除,允许删除指向单个对象的指针。 (提示:这很直观)
答案 2 :(得分:1)
您正在使用it
删除node
和delete []
。它们不是数组。您只能在对象的数组或数组上使用delete []
语法。记住经验法则对相同的数据类型使用类似的delete和new命令。如果您按new
分配了内存,请按delete
删除。如果您已按new []
分配内存,请按deete []
删除它。
答案 3 :(得分:1)
似乎it
和node
不仅指向对象而不是数组,正如Slaks指出的那样,它们似乎也可能指向同一个东西。作为旁注,在调用delete[] p
或delete p
之前,您不需要检查null:如果指针p
为空,则此表达式将不起作用。
这与您的问题无关,但请注意您的优先级排队为O(n)
(n
的大小)复杂度。通常,在实现优先级队列时,您希望获得O(log(n))
复杂性。实现这种优先级队列的最简单的策略是d-heap,它可以方便地存在于数组中,实际上比链接列表更容易维护(至少我认为)。