2012-11-28 46 views
3

我有一个任务来创建PriorityQueue结构,并且在遇到这段代码时遇到了问题。当我编译它在我的compilator一切都很好,但我想在提交给ideone,我得到以下错误:当删除一个指针时发生崩溃

"glibc detected *** ./prog: double free or corruption".

我能够跟踪这是给我这个错误的一部分,我发现了什么导致崩溃是我试图删除我的类的析构函数的指针。问题是我不知道为什么我不能删除它。我对指针没有太多了解,但我认为如果我使用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; 
} 

谢谢。

+1

使用错误的'delete'形式是UB。 – chris

回答

3

it and node指向对象,而不是数组。
您不能在其上使用delete[]的数组格式。

1

使用delete []将尝试删除其对象是某种数组的指针。还有另一种类型的删除,它允许删除指向单个对象的指针。 (提示:这很直观)

1

您正在删除itnode使用delete []。他们不是阵列。您只能在对象的数组或数组上使用delete []语法。记住使用类似的delete和new命令的相同数据类型的经验法则。如果您已通过new分配内存,请按delete删除。如果您通过new []分配了内存,请将其删除deete []

1

看起来,itnode不仅指向对象而不是数组,正如Slaks指出的那样,它似乎也指向了相同的事物。请注意,在调用delete[] pdelete p之前,您不需要检查null:如果指针p为空,则此表达式将不起作用。

这与您的问题无关,但也请注意,您的优先队列为O(n)(其中n为尺寸)的复杂性。通常,在实施优先队列时,您希望获得O(log(n))的复杂性。实现这种优先级队列的最简单的策略是d-heap,它方便地存在于一个数组中,实际上比链表更容易维护(至少我认为)。