我的For循环中出现了Segmentation Fault

时间:2013-10-15 04:53:47

标签: c++ loops for-loop segmentation-fault deque

我的代码中一直出现分段错误错误

标题

    #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设置一个循环时,它都可以正常工作 但是如果我在使用stack.pop之后立即执行for循环它将不起作用

我不确定我做错了什么

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


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

4 个答案:

答案 0 :(得分:1)

function top()返回对局部变量'num'的引用。它的存储位于堆栈上,因此在函数返回时会修改该值,然后将其用作dualStackElements的索引。这可能会导致访问无效的内存地址。

答案 1 :(得分:0)

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

dualStackElements[top(One)] = item;

你还没有声明一个dualStackElements数组

最好宣布两次出局。

deque<T> dualStackElementsOne;
deque<T> dualStackElementsTwo;

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  1. top()方法返回对方法调用后释放的局部变量num的引用。但是不同的操作系统对访问非法内存有不同的限制,有时候,它在Linux中就可以了。

  2. 在构造函数中,字段没有初始化操作:count1,count2。程序总是返回“分段错误”;如果我注释掉“count1 = count2 = 0;”在我修改过的构造函数中。

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