【问题标题】:C++/SFML program crashes on exitC++/SFML 程序在退出时崩溃
【发布时间】:2012-01-26 02:31:57
【问题描述】:

我最近才开始使用 SFML,并编写了这个简单的程序。

顺便说一句,我正在使用 Visual Studio 2010。

使用“开始调试”选项时,程序编译并运行良好。 但是如果我像运行普通桌面应用程序或其他东西一样打开 .exe 文件,它会在退出时崩溃。

我花了一段时间试图弄清楚,但我只能说这可能是堆损坏。

这是所有代码:

#include <iostream>
#include <sstream>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>


void moveSquare();
void avgFPS();

class displayFPS : public sf::Thread{
public:
private:
    virtual void Run();
};

int checkEvent(sf::RenderWindow &win){
    sf::Event Event;
    while(win.GetEvent(Event)){
        // Window closed
        if (Event.Type == sf::Event::Closed){
            return 0;
        }
        // Escape key pressed
        if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape)){
            return 0;
        }
    }
    return -1;
}

sf::RenderWindow win(sf::VideoMode(800,600,32),"Mario Clone Test");
sf::Image img1(200,200,sf::Color(255,255,0));
sf::Sprite sprite1;
std::stringstream ss;
sf::String fps;
bool threadFPS;

int main(){
    sprite1.SetImage(img1);
    sprite1.SetCenter(-300,-300);
    win.SetFramerateLimit(30);
    moveSquare();
    win.Close();
    sf::Sleep(0.5);
    return 0;
}

void moveSquare(){
    displayFPS dispFPS;
    threadFPS = true;
    dispFPS.Launch();
    fps.SetSize(20);
    while(1){
        if(!win.IsOpened() || checkEvent(win) == 0){
            threadFPS = false;
            dispFPS.Wait();
            break;
        }
        win.Draw(sprite1);
        win.Draw(fps);
        win.Display();
        win.Clear();
        if(win.GetInput().IsKeyDown(sf::Key::Left)){
            sprite1.Move(-100*win.GetFrameTime(),0);
        }
        if(win.GetInput().IsKeyDown(sf::Key::Right)){
            sprite1.Move(100*win.GetFrameTime(),0);
        }
        if(win.GetInput().IsKeyDown(sf::Key::Up)){
            sprite1.Move(0,-100*win.GetFrameTime());
        }
        if(win.GetInput().IsKeyDown(sf::Key::Down)){
            sprite1.Move(0,100*win.GetFrameTime());
        }
    }
    return;
}

void avgFPS(){
    double frames=0.0,avg=0.0;
    int j=0;
    while(threadFPS){
        if(win.GetFrameTime() != 0){
            j++;
            frames = frames+(1.0/win.GetFrameTime());
            avg = frames/j;
        }
        ss << "avg FPS: " << avg << std::endl << "Arrow Keys to Move" << std::endl << "Press ESC to Exit";
        fps.SetText(ss.str());
        ss.str("");
    }
    return;
}

void displayFPS::Run(){
    avgFPS();
}

【问题讨论】:

  • 第一件事是第一件事:您绝对确定您在调试器之外运行的 .exe 是由编译 this 代码产生的吗?它可以是以前版本的代码的可执行文件。请注意,如果您在一种模式(调试或发布)下编译,则不会构建另一种模式(因此可能是您一直在编译调试版本并且您过去编译了发布版本并且您正在运行它它正在崩溃)。删除.exe,重新编译,看看是否再次出现。
  • 我刚刚删除了 .exe 并重新构建它。是的,它仍然在退出时崩溃。构建时我确实有 1 个警告:“链接:警告 LNK4098:defaultlib 'LIBCMT' 与使用其他库发生冲突;使用 /NODEFAULTLIB:library”。以及“Mario Clone.exe 中 0x7781e3be 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xdbcf7c05。”调试时。
  • 单步调试代码,在合适的地方设置断点,看看哪里出现异常;调试器正在防止它崩溃。
  • 当我逐步完成时,异常发生在“return 0;”之后。我开始单步执行一些名为“crtexe.c”的文件,然后是“exit(mainret);”发生异常,调试结束,调试日志显示“线程'Win32 线程'(0x1f94)已退出代码0(0x0)”,“程序'[4116] Mario Clone.exe:Native'已退出代码0 (0x0)。”我认为这意味着程序已正常结束。
  • 你有很多return 0;s 所以我不知道在哪里

标签: c++ debugging visual-c++ crash sfml


【解决方案1】:

我也遇到了同样的问题。 使用VS2010时需要重新编译SFML。

【讨论】:

  • 强烈建议使用 SFML 2,因为 SFML 1.6 已经超过 2.5 年没有维护了,有很多丑陋的错误(即 ATI 错误)并且缺少很多不错的功能(@ 987654321@、sf::VertexArray等)。
【解决方案2】:

你可以尝试一些事情:

  1. 如果您怀疑堆损坏,请运行 gflags(在 Debugging Tools for Windows 中找到)并启用页堆。可以在here 找到有关其工作原理的一些说明。基本上,当启用页面堆时,您的应用将在内存错误发生时崩溃,而不是稍后。
  2. 你说你在退出时遇到了崩溃。发生这种情况时,我假设 Windows 会弹出一个崩溃对话框。打开其中一个链接,上面写着“查看正在上传的信息”。这些文件中的某个地方将是您的进程的小型转储。您可以在 Visual Studio 中加载它(打开文件并按 F5)。有时 Visual Studio 会出现故障,因此另一个更可靠但更难但更难使用的替代方案是 WinDbg,它也是 Windows 调试工具的一部分。

【讨论】:

    【解决方案3】:

    SFML 有多个版本的 .lib 用于发布和调试。

    示例:

    • sfml-audio.lib
    • sfml-audio-d.lib
    • sfml-audio-s.lib
    • sfml-audio-s-d.lib

    确保您使用的库中没有 -d。

    此外,当您将 .dll 与您的 exe 一起放置时(假设您使用的是动态库),请确保使用正常版本而不是调试 (-d) 版本。

    最后,当您构建项目时,请确保您为发布而不是调试而构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-17
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多