C++ 丢失指针值

C++ 丢失指针值,c++,pointers,sdl,C++,Pointers,Sdl,我每次运行程序都会得到相同的日志 main.cpp中有一个片段,其中每个变量都在本地范围内: EDIT: you find at the bottom. 我为启动游戏、运行菜单循环和关闭图形创建了这些函数,如果出现问题,则为gameNoError提供假值。但最后一个函数给出了以下日志消息: 没有要关闭的当前窗口或/和渲染器!SDL可能未启动、已关闭或使用了错误的指针 (注意,所有日志消息都是我自己写的,因为我想使用日志记录。) 这意味着我在某个地方丢失了指针的值,但我不知道为什么 还有我的关闭

我每次运行程序都会得到相同的日志

main.cpp中有一个片段,其中每个变量都在本地范围内:

EDIT: you find at the bottom.
我为启动游戏、运行菜单循环和关闭图形创建了这些函数,如果出现问题,则为gameNoError提供假值。但最后一个函数给出了以下日志消息:

没有要关闭的当前窗口或/和渲染器!SDL可能未启动、已关闭或使用了错误的指针

(注意,所有日志消息都是我自己写的,因为我想使用日志记录。)

这意味着我在某个地方丢失了指针的值,但我不知道为什么

还有我的关闭功能:

bool closeGraphics(FILE* logFile, SDL_Window* gameWindow, SDL_Renderer* gameRenderer)
{
    bool success = false;

    if (gameWindow == NULL or gameRenderer == NULL)
    {
        doLogging(logFile, "No present window or/and renderer to close! SDL possibly not started, closed already or wrong pointers used!");
        success = false;
    }
    else
    {
        SDL_DestroyRenderer(gameRenderer);
        gameRenderer = NULL;
        SDL_DestroyWindow(gameWindow);
        gameWindow = NULL;

        doLogging(logFile, "Renderer and window destroyed successfully!");
    }

    TTF_Quit();
    IMG_Quit();
    SDL_Quit();

    return success;
}
我只在菜单循环中使用指针进行渲染(如果您需要,我也会粘贴它!),指针在范围中使用

那么问题是什么呢

编辑: 我发现:菜单循环也松开了指针!但是SDL启动了,我不是第一个这样做的。所以我真的不知道问题出在哪里

我的项目中的文件:

main.cpp:

#include <stdio.h>
#include <string>

#include <SDL.h>

#include "initialization/utility.hpp"
#include "initialization/init_closeGraphics.hpp"
#include "menuLoop.hpp"

int main(int argc, char* argv[])
{
    bool gameNoError = true;
    SDL_Renderer* gameRenderer = NULL;
    SDL_Window* gameWindow = NULL;

    FILE* logFile = fopen("errorLog.txt", "w");
    doLogging(logFile, "Game started successfully!");

    gameNoError = initGraphics(logFile, gameWindow, gameRenderer, "This is a title!", 800, 600);

    if (gameNoError) gameNoError = doMenuLoop(logFile, gameWindow, gameRenderer, 800, 600);

    if (gameNoError)
    {
        gameNoError = closeGraphics(logFile, gameWindow, gameRenderer);
    }
    else
    {
        closeGraphics(logFile, gameWindow, gameRenderer);
    }

    if (!gameNoError)
    {
        doLogging(logFile, "Game stopped with error/exception/problem!");
    }
    else
    {
        doLogging(logFile, "Game stopped successfully!");
    }

    return 0;
}
#包括
#包括
#包括
#包括“initialization/utility.hpp”
#包括“初始化/init_closeGraphics.hpp”
#包括“menuLoop.hpp”
int main(int argc,char*argv[])
{
bool gameNoError=true;
SDL_渲染器*gameRenderer=NULL;
SDL_Window*gameWindow=NULL;
FILE*logFile=fopen(“errorLog.txt”,“w”);
doLogging(日志文件,“游戏成功启动!”);
gameNoError=initGraphics(日志文件、gameWindow、gameRenderer,“这是一个标题!”,800600);
如果(gameNoError)gameNoError=doMenuLoop(日志文件、gameWindow、gameRenderer,800600);
如果(gameNoError)
{
gameNoError=closeGraphics(日志文件、gameWindow、gameRenderer);
}
其他的
{
closeGraphics(日志文件、游戏窗口、游戏渲染器);
}
如果(!gameNoError)
{
日志记录(日志文件,“游戏因错误/异常/问题而停止!”);
}
其他的
{
doLogging(日志文件,“游戏成功停止!”);
}
返回0;
}
utility.hpp仅包含日志功能

init_close.cpp:(它有它的头)

#包括“init_closeGraphics.hpp”
bool initGraphics(文件*logFile,
SDL_窗口*游戏窗口,
SDL_渲染器*游戏渲染器,
const char*游戏名称,
int gameWindowWidth,
整数(窗口高度)
{
布尔成功=真;

如果(gameWindowWidth您正在通过值将指针变量传递给
initGraphics
,那么您的呼叫站点将不会看到对它们的任何更改

如果您希望在调用
initGraphics
时更新
main
中的变量,请通过引用获取它们:

bool initGraphics(FILE* logFile,
                  SDL_Window*& gameWindow,
//                           ^
                  SDL_Renderer*& gameRenderer,
//                             ^
                  const char* gameTitle,
                  int gameWindowWidth,
                  int gameWindowHeight)

您正在通过值将指针变量传递给
initGraphics
,因此您的调用站点不会看到对它们的任何更改

如果您希望在调用
initGraphics
时更新
main
中的变量,请通过引用获取它们:

bool initGraphics(FILE* logFile,
                  SDL_Window*& gameWindow,
//                           ^
                  SDL_Renderer*& gameRenderer,
//                             ^
                  const char* gameTitle,
                  int gameWindowWidth,
                  int gameWindowHeight)

您正在通过值将指针变量传递给
initGraphics
,因此您的调用站点不会看到对它们的任何更改

如果您希望在调用
initGraphics
时更新
main
中的变量,请通过引用获取它们:

bool initGraphics(FILE* logFile,
                  SDL_Window*& gameWindow,
//                           ^
                  SDL_Renderer*& gameRenderer,
//                             ^
                  const char* gameTitle,
                  int gameWindowWidth,
                  int gameWindowHeight)

您正在通过值将指针变量传递给
initGraphics
,因此您的调用站点不会看到对它们的任何更改

如果您希望在调用
initGraphics
时更新
main
中的变量,请通过引用获取它们:

bool initGraphics(FILE* logFile,
                  SDL_Window*& gameWindow,
//                           ^
                  SDL_Renderer*& gameRenderer,
//                             ^
                  const char* gameTitle,
                  int gameWindowWidth,
                  int gameWindowHeight)


你的代码片段并没有告诉我们需要知道的内容。问题是,代码“GAMEVISULON< /COD>或<代码> GAMEMENDER E/COD>在某个时候被设置为<代码> NULL/CONDE>。你应该使用调试器来找出它。这是真的C++吗?我看不到任何不能编译为C.CeltMcTestl的东西,也许这会编译成C,但事实上是这样的。在OP中指定C++可能与答案有关(它们可以包括C++库特征,必须假设C++编译器等)。你的观点是不真实的。我猜这是真的。“AthoNoVaALeE-DuBOIS是真的。它有很大的机会我会使用C++库。你的代码片段并不能告诉我们需要知道的内容。问题是,代码< >玩家窗口< /C> >或者<代码> GAMEMENDER < /COD>在某个时候被设置为<代码> null <代码>。你应该使用调试器来找出它。这是不是全部?我不能看到任何不能编译为C.CeltMcTestl的东西,这可能会编译成C++,但是OP指定C++可能与答案有关(这可以包括C++库特性,必须假设C++编译器等)的事实。你的观点是不真实的。我猜这是真的。“AthoNoVaALeE-DuBOIS是真的。它有很大的机会我会使用C++库。你的代码片段并不能告诉我们需要知道的内容。问题是,代码< >玩家窗口< /C> >或者<代码> GAMEMENDER < /COD>在某个时候被设置为<代码> null <代码>。你应该使用调试器来找出它。这是不是全部?我不能看到任何不能编译为C.CeltMcTestl的东西,这可能会编译成C++,但是OP指定C++可能与答案有关(这可以包括C++库特性,必须假设C++编译器等)的事实。你的观点是不真实的。我猜这是真的。“AthoNoVaALeE-DuBOIS是真的。它有很大的机会我会使用C++库。你的代码片段并不能告诉我们需要知道的内容。问题是,代码< >玩家窗口< /C> >或者<代码> GAMEMENDER < /COD>在某个时候被设置为<代码> null <代码>。你应该使用调试器来找出它。这是不是全部?我不能看到任何不能编译为C.CeltMcTestl的东西,这可能会编译成C++,但是OP指定C++可能与答案有关(这可以包括C++库特性,必须假设C++编译器等)的事实。你的观点是不真实的。啊,我想那是真的。@安东尼瓦尔E-DuBOIS是真的。我有很大的机会使用C++库。