我的 For 循环出现分段错误

I am getting a Segmentation Fault with my For loops

本文关键字:分段 错误 For 循环 我的      更新时间:2023-10-16

我的代码中不断收到分段错误错误

页眉

    #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

主.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 有一个循环时,它就会正常工作但是如果我在使用一个 for 循环来做 stack.pop 之后立即执行 for 循环,它将不起作用

不确定我做错了什么

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

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

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

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

dualStackElements[top(One)] = item;

您尚未声明双堆栈元素数组

最好改为声明两个取消排队。

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

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

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

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

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