0

私は次のコードを持っています:

/* Example OOPBEI03.CPP  */
#include <iostream>

using namespace std;

typedef char item;

class stack
{
private:
    int p;
protected:
    item *st;
public:
    stack(int m=100)
    {
        st = new item[m];
        p = 0;
    }

    ~stack()
    {
        delete [] st;
    }

    void push(item v)
    {
        st[p++] = v;
    }

    item pop()
    {
        return st[--p];
    }

    int empty()
    {
        return !p;
    }
};

class queue : public stack
{
private:
    int q;
    item *qp;
public:
    queue(int m=50):stack(m)
    {
        q = 0;
        qp = st;
    }

    ~queue()
    {
        delete qp;
    }

    item deque()
    {
        return qp[q++];
    }
};

int main()
{
    stack s(50);
    queue q(20);

    s.push('a');
    q.push('b');
    s.push('c');
    q.push('d');

    cout<<"pop   "<<s.pop()<<endl;
    cout<<"pop   "<<s.pop()<<endl;
    cout<<"deque "<<q.deque()<<endl;
    cout<<"deque "<<q.deque()<<endl;
    cout<<"empty queue? "<<q.empty()<<endl;
    cout<<"empty stack? "<<s.empty()<<endl;

    getchar();
    return 0;
}

Visual Studio の main() の最後に、「Debug Assertion Failed! ... _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)」というエラーが表示されます。

クラス キューまたはスタックのデストラクタで削除操作のコメントを解除すると (1 つの操作だけをコメント解除します!)、問題はありません。

どうすればこれを解決できますか?

4

2 に答える 2

1

スタック基本クラスとキュー派生クラスの両方でポインターを削除しています。

スタッククラスに所有権を処理させ、キューでも削除しないでください

ちなみに、コピーの作成とコピーの割り当てを非公開にするか、それ以外の場合は処理する必要があります (「3 つのルール」として知られています)。そうしないと、これらのクラスが悪い方法で簡単に使用される可能性があります...


学習用ではないコードでは、そのようなクラスを自分で実装する代わりにstd::stackandを使用してくださいstd::queue

std::stackおよびstd::queue、カスタマイズ可能な基本コンテナー タイプを持つクラス テンプレートです。

于 2013-03-15T11:37:35.157 に答える
1

削除qpは、新規作成と同じように行う必要があります (これは私の用語です)))。

delete [] qp;
       ^^

ただし、この特定のケースでは、削除qpはまったく削除する必要があります

于 2013-03-15T11:37:43.037 に答える