C++ C++;可能的构造函数错误冲突写入位置

C++ C++;可能的构造函数错误冲突写入位置,c++,access-violation,sdl-2,push-back,C++,Access Violation,Sdl 2,Push Back,我已经将这些函数添加到我的代码中,我的程序开始随机崩溃 SDL_2.exe中0x6C7B52E7(SDL2.dll)处未处理的异常:0xC0000005:访问冲突写入位置0xFF00000C。调试器显示了完全随机的代码片段,这些代码以前工作得很好,这让我想到,这些新函数会弄乱内存 void ObstacleSet::move() { Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 100, 10, 10, Coin,

我已经将这些函数添加到我的代码中,我的程序开始随机崩溃 SDL_2.exe中0x6C7B52E7(SDL2.dll)处未处理的异常:0xC0000005:访问冲突写入位置0xFF00000C。调试器显示了完全随机的代码片段,这些代码以前工作得很好,这让我想到,这些新函数会弄乱内存

void ObstacleSet::move()
{
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 100, 10, 10, Coin, -29, 0));
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 120, 10, 10, Coin, -29, 0));
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 140, 10, 10, Coin, -29, 0));
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 160, 10, 10, Coin, -29, 0));
Obstacles.push_back(Obstacle(mScreenWidth, mScreenHeight / 6 + 180, 10, 10, Coin, -29, 0));

for (auto &i : Obstacles)
    {
        i.move();
    }
}

void ObstacleSet::outCheck(unsigned int &score)
{
    for (unsigned int i = 0; i < getSize();)
    {
        if (getVelX(i) < 0 && (getX(i) + getW(i) <= 0))
        {
            eraseObstacle(i);
            score++;
        }

        else if (getVelX(i) > 0 && (getX(i) >= mScreenWidth))
        {
            eraseObstacle(i);
            score++;
        }

        else if (getVelY(i) > 0 && (getY(i) + getH(i) >= mScreenHeight))
        {
            eraseObstacle(i);
            score++;
        }

        else if (getVelY(i) < 0 && (getY(i) <= 0))
        {
            eraseObstacle(i);
            score++;
        }

        else
        {
            ++i;
        }
    }
}
以下是ObstacleSet的一些功能

void ObstacleSet::eraseObstacle(int number)
{
    unsigned N = number;
    std::list<Obstacle>::iterator i = Obstacles.begin();
    if (Obstacles.size() > N)
    {
        std::advance(i, N);
    }
        Obstacles.erase(i);
}

unsigned int ObstacleSet::getSize()
{
    return Obstacles.size();
}

float ObstacleSet::getX(int number)
{
    unsigned N = number;
    std::list<Obstacle>::iterator i = Obstacles.begin();
    if (Obstacles.size() > N)
    {
        std::advance(i, N);
    }
    return i->xPos;
}

std::list<Obstacle>::iterator ObstacleSet::getEnd()
{
    return Obstacles.end();
}
void ObstacleSet::擦除障碍物(整数)
{
无符号N=数字;
std::list::iterator i=障碍物。begin();
如果(障碍物大小()>N)
{
标准:预付款(i,N);
}
障碍。清除(i);
}
unsigned int ObstacleSet::getSize()
{
返回障碍物。大小();
}
浮点对象集::getX(整数)
{
无符号N=数字;
std::list::iterator i=障碍物。begin();
如果(障碍物大小()>N)
{
标准:预付款(i,N);
}
返回i->xPos;
}
std::list::迭代器ObstacleSet::getEnd()
{
返回障碍。结束();
}
SDL初始化代码

bool init()
{
    //Initialization flag
    bool success = true;

    //Initialize SDL
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO) < 0)
    {
        printf("SDL could not initialize! SDL Error: %s\n", SDL_GetError());
        success = false;
    }
    else
        //Set texture filtering to linear
        if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"))
        {
            printf("Warning: Linear texture filtering not enabled!");
        }

    //Initialize SDL_mixer
    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
    {
        printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
        success = false;
    }

    //Check for joysticks
    if (SDL_NumJoysticks() < 1)
    {
        printf("Warning: No joysticks connected!\n");
    }
    else
    {
        //Load joystick
        gGameController = SDL_JoystickOpen(0);
        if (gGameController == NULL)
        {
            printf("Warning: Unable to open game controller! SDL Error: %s\n", SDL_GetError());
        }
    }

    //Create window
    gWindow = SDL_CreateWindow("Jello demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    if (gWindow == NULL)
    {
        printf("Window could not be created! SDL Error: %s\n", SDL_GetError());
        success = false;
    }
    else
    {
        //Create vsynced renderer for window
        gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
        if (gRenderer == NULL)
        {
            printf("Renderer could not be created! SDL Error: %s\n", SDL_GetError());
            success = false;
        }
        else
            //Initialize renderer color
            SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);

        //Initialize PNG loading
        int imgFlags = IMG_INIT_PNG;
        if (!(IMG_Init(imgFlags) & imgFlags))
        {
            printf("SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError());
            success = false;
        }

        //Initialize SDL_ttf
        if (TTF_Init() == -1)
        {
            printf("SSDL_ttf could not initialize! SDL_ttf Error: %s\n", TTF_GetError());
            success = false;
        }
    }
    return success;
}
bool init()
{
//初始化标志
布尔成功=真;
//初始化SDL
中频(SDL_初始(SDL_初始视频| SDL_初始操纵杆| SDL_初始音频)<0)
{
printf(“SDL无法初始化!SDL错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
//将纹理过滤设置为线性
如果(!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,“1”))
{
printf(“警告:线性纹理过滤未启用!”);
}
//初始化SDL_混频器
if(Mix_OpenAudio(44100,Mix_默认格式,22048)<0)
{
printf(“SDL_混合器无法初始化!SDL_混合器错误:%s\n”,Mix_GetError());
成功=错误;
}
//检查操纵手柄
if(SDL_NumJoysticks()<1)
{
printf(“警告:未连接操纵手柄!\n”);
}
其他的
{
//装载操纵杆
gGameController=SDL_JoystickOpen(0);
if(gGameController==NULL)
{
printf(“警告:无法打开游戏控制器!SDL错误:%s\n”,SDL_GetError());
}
}
//创建窗口
gWindow=SDL_CreateWindow(“果冻演示”,SDL_WINDOWPOS_居中,SDL_WINDOWPOS_居中,屏幕宽度,屏幕高度,显示SDL_窗口);
if(gWindow==NULL)
{
printf(“无法创建窗口!SDL错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
{
//为窗口创建vsynced渲染器
gRenderer=SDL_CreateRenderer(gWindow,-1,SDL_RENDERER_加速| SDL_RENDERER_PRESENTVSYNC);
if(gRenderer==NULL)
{
printf(“无法创建渲染器!SDL错误:%s\n”,SDL_GetError());
成功=错误;
}
其他的
//初始化渲染器颜色
SDL_SetRenderDrawColor(灰色,0xFF,0xFF,0xFF,0xFF);
//初始化PNG加载
int imgFlags=IMG_INIT_PNG;
if(!(IMG_Init(imgFlags)和imgFlags))
{
printf(“SDL_映像无法初始化!SDL_映像错误:%s\n”,IMG_GetError());
成功=错误;
}
//初始化SDL\u ttf
如果(TTF_Init()=-1)
{
printf(“SSDL\u ttf无法初始化!SDL\u ttf错误:%s\n”,ttf\u GetError());
成功=错误;
}
}
回归成功;
}

可能是内存泄漏或指针悬空,但我找不到错误所在。如果有人能发现我错在哪里,我将非常高兴。如果您需要任何额外的代码块,请写信给我,除非您在某个地方有一个不变量,保证ObstacleSet不会调用空障碍列表中的任何内容,否则可能会出现问题

此代码在空列表中具有未定义的行为

float ObstacleSet::getX(int number)
{
    unsigned N = number;
    std::list<Obstacle>::iterator i = Obstacles.begin();
    if (Obstacles.size() > N)
    {
        std::advance(i, N);
    }
    return i->xPos;
}
float ObstacleSet::getX(整数)
{
无符号N=数字;
std::list::iterator i=障碍物。begin();
如果(障碍物大小()>N)
{
标准:预付款(i,N);
}
返回i->xPos;
}
试图修复它

float ObstacleSet::getX(int number)
{
    unsigned N = number;
    std::list<Obstacle>::iterator i = Obstacles.begin();
    if (Obstacles.size() > N)
    {
        std::advance(i, N);
    }
    if (i != Obstacles.end())
        return i->xPos;
    // handle empty
    return ERRORPOS; // or throw or assert or ...
}
float ObstacleSet::getX(整数)
{
无符号N=数字;
std::list::iterator i=障碍物。begin();
如果(障碍物大小()>N)
{
标准:预付款(i,N);
}
如果(i!=障碍物。结束())
返回i->xPos;
//空句柄
返回ERRORPOS;//或抛出或断言或。。。
}

与访问列表的所有其他函数相同。

我在代码中看到一些问题:

  • ObstacleSet::move()
    中,您在列表中添加了五个障碍。看起来列表可能会无限增长,导致内存溢出

  • 擦除障碍物()
    getX()
    以及可能在您尚未显示的其他函数中,您不会检查
    障碍物是否为空


  • 显然,我提供的代码中没有错误。我错误地初始化了SDL_混合器。我像这样加载音频
    if(Mix\u OpenAudio(44100,Mix\u DEFAULT\u格式,2208)<0)
    ,但我提供的wav文件的采样率不是Mix\u DEFAULT\u格式,即22050。
    无论如何,感谢所有人,他们试图帮助我编写代码。第一次使用stackoverflow是一次愉快的体验。

    您是否尝试过使用调试器并单步执行代码以查看程序在哪一行中断?能否向我们展示您的SDL初始化代码?@MigaraLiyanagamage调试器显示了完全随机的代码片段,这些代码以前工作得非常好,这让我想到,新函数会弄乱内存。@Brett代码添加到Post中。这是一个大量的代码,请尝试生成@Diversity,要么我需要更多睡眠,要么这个注释不是为我准备的。@Surf用答案替换了注释
    bool init()
    {
        //Initialization flag
        bool success = true;
    
        //Initialize SDL
        if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO) < 0)
        {
            printf("SDL could not initialize! SDL Error: %s\n", SDL_GetError());
            success = false;
        }
        else
            //Set texture filtering to linear
            if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"))
            {
                printf("Warning: Linear texture filtering not enabled!");
            }
    
        //Initialize SDL_mixer
        if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
        {
            printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
            success = false;
        }
    
        //Check for joysticks
        if (SDL_NumJoysticks() < 1)
        {
            printf("Warning: No joysticks connected!\n");
        }
        else
        {
            //Load joystick
            gGameController = SDL_JoystickOpen(0);
            if (gGameController == NULL)
            {
                printf("Warning: Unable to open game controller! SDL Error: %s\n", SDL_GetError());
            }
        }
    
        //Create window
        gWindow = SDL_CreateWindow("Jello demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
        if (gWindow == NULL)
        {
            printf("Window could not be created! SDL Error: %s\n", SDL_GetError());
            success = false;
        }
        else
        {
            //Create vsynced renderer for window
            gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
            if (gRenderer == NULL)
            {
                printf("Renderer could not be created! SDL Error: %s\n", SDL_GetError());
                success = false;
            }
            else
                //Initialize renderer color
                SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
    
            //Initialize PNG loading
            int imgFlags = IMG_INIT_PNG;
            if (!(IMG_Init(imgFlags) & imgFlags))
            {
                printf("SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError());
                success = false;
            }
    
            //Initialize SDL_ttf
            if (TTF_Init() == -1)
            {
                printf("SSDL_ttf could not initialize! SDL_ttf Error: %s\n", TTF_GetError());
                success = false;
            }
        }
        return success;
    }
    
    float ObstacleSet::getX(int number)
    {
        unsigned N = number;
        std::list<Obstacle>::iterator i = Obstacles.begin();
        if (Obstacles.size() > N)
        {
            std::advance(i, N);
        }
        return i->xPos;
    }
    
    float ObstacleSet::getX(int number)
    {
        unsigned N = number;
        std::list<Obstacle>::iterator i = Obstacles.begin();
        if (Obstacles.size() > N)
        {
            std::advance(i, N);
        }
        if (i != Obstacles.end())
            return i->xPos;
        // handle empty
        return ERRORPOS; // or throw or assert or ...
    }