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

主文件

    #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 有一个循环时,它都会正常工作,但如果我在使用一个循环后立即执行 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

我认为您误解了它的作用(或者我误解了您的代码):

dualStackElements[top(One)] = item;

你还没有声明一个 dualStackElements 数组

最好改为声明两个出队。

deque<T> dualStackElementsOne;
deque<T> dualStackElementsTwo;
于 2013-10-15T05:19:47.433 回答
0
  1. top() 方法返回对在方法调用后释放的局部变量 num 的引用。但是不同的操作系统对非法内存的访问有不同的限制,有时在Linux下就可以了。

  2. 在您的构造函数中,没有对字段进行初始化操作:count1、count2。程序总是返回“Segmentation fault;” 如果我注释掉“count1=count2=0;” 在我修改后的构造函数中。

  3. 为了获得程序的稳定结果,您应该在 make 之前进行清理。我不知道确切原因,但它确实发生在我的测试运行中。

于 2013-10-15T08:18:11.267 回答
0

您的Top方法需要一些错误检查。如果count1是 0(或count2> 20)怎么办?您将返回一个负值,然后将其用作双端队列的索引。并通过引用删除返回!

于 2013-10-15T05:26:57.460 回答