【问题标题】:Can't find the source of .NET error, need Help找不到.NET错误的来源,需要帮助
【发布时间】:2011-09-24 12:07:10
【问题描述】:

我正在使用 .NET Framework 2.0 来编写 2d 平台游戏。我正在使用 SFML .NET,因为它是跨平台的,受 MONO 支持,并且具有成熟的 API。我的问题是,虽然我的程序可以正确编译并正常运行,但在关闭它时出现错误。

“0x5ed0530e”处的指令引用了“0x0000051c”处的内存。内存无法“读取”

仔细调试后发现问题是在我初始化SFML String2d类之后出现的。

怎么了;为什么关闭程序时会出现这个错误?即使没有任何问题,是否有办法停止接收错误,以便我的程序的用户不会对此感到恼火?

使用系统; 使用 SFML.Graphics; 使用 SFML.Window;

namespace ProGUI
{
    class TextBox : Sprite
    {
        private String2D Text;
        public TextBox(RenderWindow App)
        {
            Image = new Image(App.Width, App.Height / 4, new Color(0, 0, 0));
            Position = new Vector2(0, App.Height - App.Height / 4);
        }

        public void SetText(string text)
        {
            Text = new String2D(text);
            Text.Font = new Font("Greyscale_Basic_Bold.ttf");
            Text.Position = new Vector2(Position.X + 5, Position.Y + 5);
            Text.Size = 12;
        }

        public string GetText()
        {
            return Text.Text;
        }

        public void Render(RenderWindow App)
        {
            App.Draw(this);
            App.Draw(Text);
        }

        public void MainLoop(RenderWindow App, Color clr)
        {
            while (App.IsOpened())
            {
                App.Clear(clr);

                App.DispatchEvents();

                App.Draw(this);
                App.Draw(Text);

                App.Display();
            }
        }
    }
}

如您所见,没有不可靠的代码。绝对干净和简单。

【问题讨论】:

  • 该错误听起来像是来自非托管代码或 COM 组件。错误中是否包含堆栈跟踪?你能把出错的代码贴出来吗?
  • @burningprodigy:您的应用程序关闭时是否调用了该代码?如果有,为什么?
  • 非常不同意没有错。您至少未能验证参数、解决整数溢出问题并正确处理资源。
  • 可能不是您的错误的根源,但是您是否曾经在您创建的Font 对象上调用Dispose?由于您始终使用相同的字体,因此无需每次都重新创建对象;创建一次并将其存储在一个字段中,这将消除一些不必要的处理和内存压力。
  • “尽管 C# 是一种静态类型语言,但即使是 INDENTS”也没有多大意义。这让人对“我检查了一切”产生了一些疑问。

标签: c# .net 2d sfml


【解决方案1】:

SFML String2d 类是否实现 IDisposable?您是否正确处理所有实例?

当它们处于无效状态时,可能是终结器线程正在处理它们。

【讨论】:

    【解决方案2】:

    在您的应用编译后,从 Visual Studio 命令行尝试“EditBin.exe /NXCOMPAT:NO C:\AppName.exe”。

    【讨论】:

      【解决方案3】:

      您会发现String2d 类:

      • 有错误

      或者(更有可能,根据您的问题的描述)

      • 在应用生命周期的错误时间点被调用。

      例如,Text 属性的容器此时是否已初始化?是否有多个线程同时访问 Text 属性(在您的情况下,我正在考虑某种游戏循环)?

      对我来说,由于这发生在您的应用程序关闭时,我希望在关闭期间调用此 SetText 方法,窗体/窗口已被运行时释放。如果你在表单的Closed 事件中设置this.Text 的代码,你会得到类似的结果。

      【讨论】:

        【解决方案4】:

        您最好在 SFML 论坛上提出这个问题。快速谷歌出现了this thread,这表明 String2D 类型存在问题。

        【讨论】:

          【解决方案5】:

          这段代码将无限递归:

              public void Render(RenderWindow App)
              {
                  App.Draw(this);
                  App.Draw(Text);
              }
          

          因为App.Draw,调用Spritex,将调用x.Render(App)。所以App.Draw(this) 会在内部调用this.Render(App)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-25
            • 1970-01-01
            • 1970-01-01
            • 2015-09-16
            • 1970-01-01
            • 1970-01-01
            • 2023-04-09
            • 2021-07-15
            相关资源
            最近更新 更多