【发布时间】: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