【问题标题】:Segmentation fault initializing SDL2. What am I doing wrong with memory?初始化 SDL2 的分段错误。我做错了什么记忆?
【发布时间】:2017-06-16 05:29:52
【问题描述】:

这只是假设向 SDL 窗口前端缓冲区显示 bmp 图像。我玩弄了代码。而且我认为我的 init() 函数有问题。我是 SDL 的新手。但是我的指针一定有问题,或者我对 SDL 的功能遗漏了一些东西 编辑:我使用了 GDB,结果发现我的 close() 函数是问题所在。我相信这是因为我正在释放设置为 NULL 的内存?我摆脱了关闭功能,并在延迟功能后释放了内存。

#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdbool.h>
#define SCREENWIDTH 640
#define SCREENHEIGHT 480
SDL_Window *win = NULL;
SDL_Surface *scrn = NULL;
SDL_Surface *mscrn = NULL;
bool init()
{
   bool suc = true;
   char name[11] = "Hello SDL";
   if (SDL_Init(SDL_INIT_VIDEO) != 0) {
    printf("%s", SDL_GetError());
    suc = false;
   } 
  win = SDL_CreateWindow(name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREENWIDTH, SCREENHEIGHT, SDL_WINDOW_SHOWN);
  if (win == NULL) {
    printf("%s", SDL_GetError());
    suc = false;
  }
scrn = SDL_GetWindowSurface(win);

return suc;
}   
bool loadmedia()
 {
   bool suc = true;
   mscrn = SDL_LoadBMP("hello_world.bmp");
   if (mscrn == NULL) {
   printf("%s", SDL_GetError());
   suc = false;
  }
   return suc;
} 
void close()
{
  SDL_FreeSurface(mscrn);
   SDL_DestroyWindow(win);
   SDL_Quit();
}
int main(int argc, char* args[])
{
 if (!init()) {
   close();
   return 1;
  } 
  if (!loadmedia()) {
   close();
   return 1;
  } 
   SDL_BlitSurface(mscrn, NULL, scrn, NULL);
   SDL_UpdateWindowSurface(win);
   SDL_Delay(3000);

   close();
   return 0;
}

【问题讨论】:

  • 你的编译器告诉你关于close()的什么?
  • close 到底应该做什么?
  • 猜想:如果 SDL_Init 失败,您会发送消息(并且永远不会看到它,因为没有尾随换行符,因此没有隐式刷新),然后继续前进并尝试创建一个窗口。窗户表面也是如此。此时菜单上有一个调试器
  • 我的 close() 函数原来是问题所在。完成后我想释放 mscrn 并销毁一个窗口。我认为问题是如果 init() 为 false 那么 win 将设置为 NULL 并且 msrcn 仍将设置为 NULL 吗?但似乎我最大的问题是没有使用调试器
  • @ZhangBing close 是一个问题,只是因为它的名字。有一个具有该名称的标准 libc 函数,它关闭文件描述符,您的函数将覆盖它,但做的事情完全不同。在SDL_Init 期间,SDL 可以使用文件描述符,例如连接到 X11 服务器(通过网络套接字),查询一些信息,并在该描述符上调用 close,然后调用您的 close - 但此时尚未创建窗口和渲染器。不要覆盖系统功能。重命名或标记为static。你也不应该释放窗口表面。

标签: c sdl sdl-2


【解决方案1】:

您应该找到一个合理的调试器和其他工具来找出导致错误的行以及原因。基本上,它归结为使用调试器,如果您使用的是 IDE 通常随附的调试器,或者使用非常好的代码分析工具 Valgrind。

如果您使用 gcc,您可能可以使用 gdb 轻松调试您的程序。以下是有关如何帮助您诊断分段错误的一些资源:

熟悉这些工具,因为它们会在您将来遇到新问题时为您节省无数时间。

【讨论】:

  • 谢谢! gdb 总是让我感到困惑,直到我点击你的链接并学习了“回溯”命令
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多