OutOfMemoryException,Loop / While的结果?

时间:2018-01-19 20:51:29

标签: c# exception memory out-of-memory unhandled

我正在研究C#中的一个项目,其中一个问题是创建一个接收堆栈的程序并返回一个新堆栈,其中包含出现在该堆栈中的数字(出现的每个数字都在新堆栈只有一次)。

我制作了这个代码,它工作得很好,但在中间它只是停止工作并且它给出了这个错误“Unhandled Exception:OutOfMemoryException”。

我想知道这是什么问题?根据我的理解,它发生是因为我的程序需要的内存比计算机所能提供的内存多。如我错了请纠正我。

有谁知道我可以做些什么来解决这个问题,或者我如何改进我的代码以防止这种情况发生?

我可以在代码中做些什么来防止将来发生此问题?

非常感谢您提前。 :)

public static Stack<int> Stk(Stack<int> S)
    {
        int Num;
        Stack<int> New = new Stack<int>();
        while (!S.IsEmpty())
        {
            Num = S.Pop();
            while (Num != 0)
            {
                if (!Check(New, (Num % 10)))
                {
                    New.Push(Num % 10);
                }
                Console.WriteLine("Original Stack: " + New);
                Num = Num / 10;
            }
        }
        return New;
    }

    public static bool Check(Stack<int> S, int num)
    {
        Stack<int> Temp = new Stack<int>();
        while (!S.IsEmpty())
        {
            Console.WriteLine("Stack Temp: " + Temp);
            if (num == S.Top())
            {
                while (!Temp.IsEmpty())
                {
                    S.Push(Temp.Top());
                }
                Console.WriteLine("Number found in Stack S!");
                Console.WriteLine("Stack S: " + S);
                return true;
            }
            Temp.Push(S.Pop());
        }
        while (!Temp.IsEmpty())
        {
            S.Push(Temp.Pop());
        }
        Console.WriteLine("Stack S: " + S);
        Console.WriteLine("Number NOT found in Stack S!");
        return false;
    }

1 个答案:

答案 0 :(得分:0)

if (num == S.Top())
{
    while (!Temp.IsEmpty()) // Infinite loop, Temp is never empty
    {
        S.Push(Temp.Top()); // Because of infinite loop, S is just going to fill up memory
    }

    //...

我对Top()上的Stack<T>不熟悉,但从代码的其余部分判断它看起来不会从堆栈中删除一个对象(我知道的那个函数确实如此)这是Peek)。如果是这种情况,你就会有一个无限循环,它会填满所有可用的内存并最终耗尽。

修改:此答案主要针对您遇到的问题。这对我来说闻起来像家庭作业,所以我不打算重写它,但我建议在@ ckuri的评论中支付这个答案。看起来你做的工作比你应该做的要多得多。您可能希望查看迭代堆栈而不是弹出一个全新的堆栈。