SDL2 / C ++文件I / O错误

时间:2015-09-02 10:28:51

标签: c++ sdl-2

我正在测试一个游戏机制,其中有两个文件(一个名为' X.txt'另一个' Y.txt')跟踪你的X和Y位置。它的工作方式是每次调用播放器的更新(即移动)时,程序会将坐标写入X和Y文件。当您关闭程序并重新打开该文件时,您将从上次关闭程序时所处的X和Y坐标开始。我有两个问题:

1)每次运行程序时,我都会从默认坐标(0,0)开始,即使我告诉程序从文件中读取数据。

2)当我关闭程序时,我收到一条错误说:

' FNTSTWE.exe中0x576812A7(msvcp120d.dll)的未处理异常:0xC0000005:访问冲突读取位置0xFEEEFEEE。'

错误是可变的,它们总是完全不同,这只是我得到的许多错误之一。

此外,有时它会引导我使用不同的文件,例如&x; xlocale'或者' output.c'。

我认为这两件事是相互联系的,如果我能解决这些问题,我可以让他们两个都工作。

以下是代码:https://www.dropbox.com/s/j56kb41q3bmmnby/Program_SDL2_IO_Error.zip?dl=0

只需查看代码,请告诉我我做错了什么。

为了重新创建我正在讨论的错误,使用这些文件创建一个Visual Studio SDL2项目并调试它以查看我的意思。

请帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

  1. CReadWriter类'函数中,您将参数作为值传递,因此不会更改curX的值,并且CPlayer::CPlayer中的curY(它们保持为0)。
  2. CPlayer::~CPlayer(析构函数)中,您将Image_Surface设置为NULL,然后尝试使用SDL_FreeSurface释放它,从而导致内存错误。
  3. <强>解决方案:

    1. 请参阅这篇文章,了解不同的论证传递方式之间的区别:What's the difference between passing by reference vs. passing by value?
    2. 您的阅读方法必须类似于:

      void ReadX(int* X); // pass a pointer to the variable, in which you want to store the read value
      void ReadX(int& X); // pass a reference to the variable ....
      
      1. 更改析构函数中两个语句的顺序:首先释放图像表面,然后将变量设置为NULL