【问题标题】:OutOfMemoryException, Result of Loop/While?OutOfMemoryException,循环/While 的结果?
【发布时间】:2018-06-29 04:22:39
【问题描述】:

我正在使用 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;
    }

【问题讨论】:

  • 我想知道是什么问题? Debugger Basics
  • @Debugger Basics - rene - 程序工作正常(它完成了它需要做的事情)但总是在中间它只是停止工作(冻结)并给我“未处理的异常:OutOfMemoryException”错误.
  • 老实说,一个经常崩溃的程序并不是“运行良好”的真正定义。
  • @MichaelRoy - 我的错。我的意思是说它至少在运行,只是没有正确运行,没有做它应该做的事情。请原谅我的英语不好,这不是我的母语。

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


【解决方案1】:
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
    }

    //...

我对@9​​87654323@ 上的Top() 不熟悉,但从其余代码来看,它似乎没有从堆栈中删除对象(我知道的函数是@987654324 @)。如果是这种情况,您将获得一个无限循环,该循环会填满所有可用内存并最终耗尽。

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

【讨论】:

  • 这似乎是一个简单的拼写错误; Pop.
  • 我考虑过,但他似乎在使用它,就像Peek 一样。遵循他似乎正在尝试做的逻辑,并且包含相同的问题。
  • 是的,我了解了 Top() 命令,它检查顶部值而不将其从堆栈中弹出。我试图做的是遍历整个堆栈但不会丢失它(无论其中有什么),所以我将弹出的内容推送到另一个堆栈中,最后将它返回到同一个堆栈中。据我所知,如果我将堆栈中的值弹出并转移到该函数内部的该函数中,则主函数的堆栈也会受到影响。如果我错了纠正我? (对不起,如果有点难以理解,我不知道如何解释得这么好:P)
  • 在这种情况下,这就是答案。你有一个无限循环。另外,我从未听说过Top 它在哪里记录?我知道的功能是Peek
  • @RKei 如果你想在不接触堆栈的情况下遍历堆栈,那么只需使用foreach 枚举它。如果你想复制一个堆栈,你只需写var copy = new Stack&lt;int&gt;(sourceStack);
猜你喜欢
  • 2014-12-05
  • 2014-06-20
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 2017-05-19
相关资源
最近更新 更多