3

PriorityQueue構造を作成する割り当てがあり、このコードで問題が発生しています。コンパイラでコンパイルするとすべて問題ありませんが、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;
}

ありがとう。

4

4 に答える 4

3

it配列ではなくオブジェクトをnode指します。
それらにの配列形式を使用することはできませんdelete[]

于 2012-11-28T01:29:18.113 に答える
1

delete []を使用すると、オブジェクトが何らかの配列であるポインターを削除しようとします。別のタイプの削除があり、単一のオブジェクトへのポインターを削除できます。(ヒント:それはかなり直感的です)

于 2012-11-28T01:31:16.770 に答える
1

を削除itnodeて使用してdelete []います。それらは配列ではありません。delete []構文は、オブジェクトの配列または配列でのみ使用できます。同じデータ型に対して同様のdeleteコマンドとnewコマンドを使用するという経験則を覚えておいてください。でメモリを割り当てた場合はnew、で削除しdeleteます。でメモリを割り当てた場合はnew []、で削除してくださいdeete []

于 2012-11-28T01:31:27.617 に答える
1

Slaksが指摘したように、配列ではなくオブジェクトを指しているだけでなく、同じものを指している可能性もあるようですitnodeちなみに、呼び出す前にnullをチェックする必要はありません。delete[] pまたはdelete p:ポインタpがnullの場合、この式は効果がありません。

O(n)それはあなたの質問とは関係ありませんが、あなたの優先キューは(nサイズであるが)複雑さであることに注意してください。通常、優先キューを実装するときは、O(log(n))複雑さを求めます。このような優先度付きキューを実装する最も簡単な戦略は、dヒープです。これは、便利なことに配列内にあり、リンクリストよりも実際に保守が簡単です(少なくとも私は思います)。

于 2012-11-28T01:36:00.073 に答える