1

コードでセグメンテーション違反エラーが発生し続けます

ヘッダ

    #ifndef DUALSTK
    #define DUALSTK

    #include <deque>

    using namespace std;

    enum stackNumber {One, Two};


    template <typename T>
    class dualStack {
        public:
        // constructor. set counts to 0
            dualStack() : dualStackElements(20, 0) {}

            void push(const T& item, stackNumber n);
            void pop(stackNumber n);

            T& top(stackNumber n);
            //const T& top(stackNumber n) const;

            bool empty(stackNumber n) const;
            int size(stackNumber n) const;

            int getCount1() const {return count1;}
            int getCount2() const {return count2;}

        private:
            deque<T> dualStackElements;
            int count1, count2;
    };

    #endif  // DUALSTK

main.cpp

    #include <iostream>
    #include <deque>
    #include "dualstk.h"

    using namespace std;

    template <typename T>
    T& dualStack<T>::top(stackNumber n) {
        int num = 0;
        if (n == 0) {
            num = count1 - 1;
            return num;
        }

        if (n == 1) {
            num = 20 - count2;
            return num;
        }
    }


    template <typename T>
    void dualStack<T>::push(const T& item, stackNumber n) {
        if (n == 0) {
            count1++;
            dualStackElements[top(One)] = item;
        }

        if (n == 1) {
            count2++;
            dualStackElements[top(Two)] = item;
        }
    }

    template <typename T>
    void dualStack<T>::pop(stackNumber n) {
        int item = 0;
        int item2 = 0;
        if (n == 0) {
            item = dualStackElements[top(One)];
            cout << item << " ";
            count1--;
        }

        if (n == 1) {
            item2 = dualStackElements[top(Two)];
            cout << item2 << " ";
            count2--;
        }
    }

    template <typename T>
    bool dualStack<T>::empty(stackNumber n) const {

return 1;
    }



    int main() {

        dualStack<int> stack;

        for(int i = 1; i < 21; i++) {
            if(i % 2 == 0) {
                stack.push(i, One);
            }
            else {
                cout << i;
                stack.push(i, Two);
            }
        }

        cout << endl;


        for (int j = 0; j < 10; j++)
            stack.pop(One);

        cout << endl;

        for (int i = 0; i < 10; i++)
            stack.pop(Two);

        cout << endl;

        cout << stack.getCount2();
        cout << stack.getCount1();

        cout << endl;


        cout << "\n" << stack.top(One);
        cout << stack.top(Two) << endl;

        return 0;
    }

stack.pop のループが 1 つある場合は常に正常に動作しますが、1 つを使用して stack.pop を実行した直後に for ループを実行すると、動作しません。

私はこれに何が間違っていたのか分かりません

        for (int j = 0; j < 10; j++)
            stack.pop(One);


        for (int i = 0; i < 10; i++)
            stack.pop(Two);
4

4 に答える 4

1

関数 top() は、ローカル変数 'num' への参照を返します。そのストレージはスタック上にあるため、関数が戻ったときに値が変更され、dualStackElements へのインデックスとして使用されます。これにより、無効なメモリ アドレスにアクセスする可能性があります。

于 2013-10-15T05:26:59.510 に答える
0

メソッドTopにはエラー チェックが必要です。count10 (またはcount2> 20)の場合は? 負の値を返し、それを両端キューへのインデックスとして使用します。そして、参照によるリターンを削除してください!

于 2013-10-15T05:26:57.460 に答える
0

これが何をするのかを誤解していると思います(またはコードを誤解しました):

dualStackElements[top(One)] = item;

dualStackElements の配列を宣言していません

代わりに、2 つのデキューを宣言することをお勧めします。

deque<T> dualStackElementsOne;
deque<T> dualStackElementsTwo;
于 2013-10-15T05:19:47.433 に答える
0
  1. top() メソッドは、メソッド呼び出し後に解放されたローカル変数 num への参照を返します。しかし、OS によって不正なメモリへのアクセスに関する制限が異なります。Linux では問題ない場合もあります。

  2. コンストラクターには、フィールド count1、count2 の初期化操作はありません。プログラムは常に「セグメンテーション違反」を返します。「count1=count2=0;」をコメントアウトすると 私の変更されたコンストラクターで。

  3. プログラムの安定した結果を得るには、make の前にクリーンを行う必要があります。正確な理由はわかりませんが、テスト実行で発生しました。

于 2013-10-15T08:18:11.267 に答える